4.1 Jsoup解析

    技术2022-07-10  134

    在上一章介绍了如何使用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()); } } }

    程序运行结果如下图所示。

    Processed: 0.017, SQL: 9