在上一章介绍了如何使用Jsoup获取网页资源,本节将重点介绍Jsoup的解析功能。Jsoup依赖于CSS选择器与jQuery方法来操作HTML文件中的数据。使用Jsoup解析前,需要了解Node、Element和Document的概念以及CSS选择器、Jsoup获取元素和Jsoup获取元素文本的方法。
1.Node、Element和Document简介
节点(Node):HTML文件中所包含的内容都可以看成一个节点。节点有很多种类型,如属性节点(Attribute)、注释节点(Node)、文本节点(Text)和元素节点(Element)等。解析文件的过程,实际上就是对节点操作的过程。
元素(Element):节点的子集,所以一个元素也是一个节点。
文档(Document):整个HTML文档的源码内容。
2.CSS选择器
CSS(Cascading Style Sheets),即层叠样式表,主要用于HTML文档的样式化与布局,具体涉及字体、颜色、编辑和高级定位。CSS Selector,即CSS选择器,是用于匹配元素(Elements)的一种模式。在网络爬虫中,常使用CSS选择器,定位HTML文档中的元素,进而抽取HTML文档中的相应字段。下面介绍,chrome浏览器获取元素Selector的方法。首先,按F12打开chrome的开发者工具,点击工具左上角箭头的图标,然后移动鼠标到目标元素的上,此时工具上会高亮被选中的元素,点击右键选择Copy下的Copy selector即可。
3.Jsoup获取元素的常用方法
方法 | 描述 |
---|---|
Elements getElementsByTag(String tagName) | 基于标签名称获取元素集合 |
Element getElementById(String id) | 基于id获取元素 |
Elements getElementsByClass(String className) | 基于类名称获取元素集合 |
Elements getElementsByAttribute(String key) | 基于属性名称获取元素集合 |
Elements getElementsByAttributeValue(String key, String value) | 基于属性值获取元素集合 |
Elements children() | 获取子元素集合 |
Elements siblingElements() | 获取兄弟元素集合 |
Element nextElementSibling() | 获取下一个兄弟元素 |
Element previousElementSibling() | 获取上一个兄弟元素 |
Element firstElementSibling() | 获取第一个兄弟元素 |
Element lastElementSibling() | 获取最后一个兄弟元素 |
4.Jsoup获取元素文本的常用方法
方法 | 描述 |
---|---|
String text() | 元素的所有文本信息 |
String ownText() | 文本节点的信息 |
List childNodes() | 获取孩子节点集合 |
List textNodes() | 获取文本节点的集合 |
程序4-1
public class Jsoup {
public static void main(String[] args) {
String pStr = "<p>One <span>Two</span> Three <br> Four</p>";
Document document = Jsoup.parse(pStr);
Element p = document.getElementsByTag("p").get(0);
//text() 输出:One Two Three Four
System.out.println("text()方法输出:" + p.text());
//ownText() 输出:One Three Four
System.out.println("ownText()方法输出:" + p.ownText());
//children() 输出:<span>Two</span> <br>
Elements children = p.children();
System.out.println("children()方法输出:" + children.toString());
//childNodes() 输出:[One , <span>Two</span>, Three , <br>, Four]
List<Node> nodeList = p.childNodes();
System.out.println("childNodes()方法输出:" + nodeList.toString());
//textNodes() 输出:[One , Three , Four]
List<TextNode> textNodeList = p.textNodes();
System.out.println("textNodes()方法输出:" + textNodeList);
}
}
程序运行结果如下图所示。
5.遍历元素
//程序4-2
public class Jsoup {
public static void main(String[] args) {
String str = "<ul>\n" +
"\t<li>Spring</li>\n" +
"\t<li>SpringBoot</li>\n" +
"\t<li>SpringCloud</li>\n" +
"</ul>";
Document document = Jsoup.parse(str);
Elements liElements = document.getElementsByTag("li");
for(Element element:liElements){
System.out.println(element.text());
}
}
}
程序运行结果如下图所示。