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){
-
System.out.println(element);
-
}
}
通过css选择器获得元素对象
Elements select (String cssQuery)
通过css选择器获取Elements对象
Element selectFirst(String cssQuery)
通过css选择获得第一个Element对象
普通选择器:
ID选择器 | #id |
class选择器 | .class |
标签选择器 | div |
属性选择器 | [attr] |
属性值选择器 | [attr=xx] |
组合选择器:
标签名.类名 | div.one | class属性为one的div标签 |
标签名[属性名] | a[href] | 有href属性的a标签 |
父元素 子元素 | div a | div内的a标签 |
兄弟标签A+兄弟标签B | div+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(); //获取元素的标签体内容