当前位置: 首页 > 工具软件 > Jsoupxpath > 使用案例 >

Jsoup和JsoupXpath详解

卫弘义
2023-12-01

Jsoup

jsoup 是一款Java 的XML、HTML解析器,可直接解析某个URL地址、HTML文本内容和已经存在的文件。

XML DOM和HTML DOM一样,都会将xml文件中的所有标签记载到内存并生成一个document对象保存他们

jsoup获取xml、html文件的document对象三种方式:

1.解析一个字符串获取Document对象

static  Document  parse (String  html)

 

String html = "<div><a href='#'>jsoup测试</a></div>";

Document doc = Jsoup.parse(html);

很少有人会用字符串写html代码,所以此方法并不常用

2.解析一个html文档获取Document对象

static  Document  parse (File in , String  characterName)

 

String path = test.class.getResource("/html/example.html").getPath();

Document doc = Jsoup.parse(new File(path),"utf-8");

要获取到html文件,可以使用当前的类对象调用getResource()获取到文档的URL对象

然后使用URL对象调用getPath()方法就可以获得html文档的绝对路径

3,解析一个URL资源获取Document对象

static  Connection  connect(String  url)

用获取的连接对象调用get()方法就能获得Document对象

 

Connection conn = Jsoup.connect("https://www.hao123.com");

Document doc = conn.get();

通过标签属性获得Element对象

Element  getElementById (String  id )                                            

通过id属性获取一个元素对象

Element tab1 = doc.getElementById("tab1");

Elements  getElementsByTag (String tagName )                         

通过标签获取一个元素集合对象

 

Elements tr = doc.getElementsByTag("tr");

for (Element element : tr){

    System.out.println(element);

}

Elements是一个继承了ArrayList的集合,所以可以直接使用集合的方法,里面保存的都是Element对象

Elements  getElementByClass( String className)                    

通过元素类名获取一个元素集合对象

 

Elements cn = doc.getElementsByClass("cn");

for (Element element :cn){

  1. System.out.println(element);

  2. }

    }

通过css选择器获得元素对象

Elements  select (String  cssQuery)          

通过css选择器获取Elements对象

Element  selectFirst(String  cssQuery)  

通过css选择获得第一个Element对象

普通选择器:

ID选择器#id
class选择器.class
标签选择器div
属性选择器[attr]
属性值选择器[attr=xx]

组合选择器:

标签名.类名div.oneclass属性为one的div标签
标签名[属性名]a[href]有href属性的a标签
父元素 子元素div  adiv内的a标签
兄弟标签A+兄弟标签Bdiv+span取到与div标签同级的span标签

JsoupXPath

JsoupXPath是基于Jsoup的拓展,使用路径的形式解析XML和HTML文档。核心类为JXDocument

JsoupXPath的节点对象JXNode不仅可以获取标签节点,还可以获取属性节点

public  JXDocument (Document   doc)                                          使用Document对象来创建JXDocument对象

 

String path = test.class.getResource("/html/example.html").getPath();

Document doc = Jsoup.parse(new File(path),"utf-8");

JXDocument jxd = new JXDocument(doc);

List<JXNode>  selN( String  xpath)                                                   

找到路径返回所有满足的节点对象集合

类似Document的select()方法

JXNode  selNOne(String  xpath)                                                        

找到路径返回的第一个满足的节点对象

类似Document的selectFirst()方法

JsoupXPath有4种寻找节点的方式:

1.绝对路径语法

就是以“/”开头,一级一级描述标签的层级路径,不可以跨层级

"/父元素/子元素/孙元素/..."

 

String path = test.class.getResource("/html/example.html").getPath();

Document doc = Jsoup.parse(new File(path),"utf-8");

JXDocument jxd = new JXDocument(doc);

String str = "/body/table/tbody/tr/td"; //绝对路径找节点

List<JXNode> list = jxd.selN(str);

2.相对路径语法

已有JXNode节点对象的情况下,通过此节点再往下寻找此对象内的其他节点

"./子元素/孙元素"

 

String path = test.class.getResource("/html/example.html").getPath();

Document doc = Jsoup.parse(new File(path),"utf-8");

JXDocument jxd = new JXDocument(doc);

JXNode jxn = jxd.selNOne("/body/table/tbody");

List<JXNode> sel = jxn.sel("./tr");

先用JXDocument的selNOne()获取一个JXNode节点对象

相对当前节点元素位置继续查找节点,使用JXNode对象的sel()方法再找到所有符合的节点对象集合

3.全文搜索路径

在全局搜索对应的标签,不需要从根目录开始搜索

"//元素"                                                           全局搜索元素 

"//元素/子元素或@元素属性"                      全局搜索元素后的子路径中找子元素或属性

 

String path = test.class.getResource("/html/example.html").getPath();

Document doc = Jsoup.parse(new File(path),"utf-8");

JXDocument jxd = new JXDocument(doc);

List<JXNode> jxNodes = jxd.selN("//td/input/@type"); //返回type属性节点对象

若全文路径指向的是@元素属性,则返回的是属性节点对象

若全文路径指向的是元素,则返回的是元素节点对象

4.条件筛选语法

根据条件筛选过滤节点,前面部分为筛选的条件,后面可以加上操作的动作

//元素[@属性=value]                                                                               筛选属性为value值的节点对象

//元素[@属性=value]/text()        元素[@属性=value]/html()          

获取元素为value值的标签体内容对象

 

String path = test.class.getResource("/html/example.html").getPath();

Document doc = Jsoup.parse(new File(path),"utf-8");

JXDocument jxd = new JXDocument(doc);

List<JXNode> jxNodes = jxd.selN("//input[@type=checkbox]/html()");

若不加上后面操作的动作,则返回的时候元素节点对象集合

若加上操作动作,则返回的是操作后的值对象集合

Element

JXNode可以调用getElement获得Element对象

 

JXNode jxn = jxd.selNOne("//input[@type=checkbox]");

Element ele = jxn.getElement();

String  attr("属性名")                

得到元素上指定属性的值

Elements  children()      

获取当前元素的子元素列表

String  tagName()         

得到元素的标签名

String  text()      

获取元素体文本数据

 

String path = test.class.getResource("/html/example.html").getPath();

Document doc = Jsoup.parse(new File(path),"utf-8");

Element element = doc.selectFirst("tr");

String id = element.attr("id");                //获取id的属性值

Elements children = element.children();        //获取元素下的所有子对象元素

String tag = element.tagName();                //获取元素的标签名

String text = element.text();                  //获取元素的标签体内容

 类似资料: