soup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
jsoup的主要功能如下:
- 从一个URL,文件或字符串中解析HTML;
- 使用DOM或CSS选择器来查找、取出数据;
- 可操作HTML元素、属性、文本
解析和遍历Document
String html = "<html><head><title>First parse</title></head>"
+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);String html = "<html><head><title>First parse</title></head>"
+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
解析器将尽一切努力从您提供的 HTML 中创建干净的解析,无论 HTML 是否格式正确。例如:
- 未闭合的标签(例如<p>Lorem <p>Ipsum解析为<p>Lorem</p> <p>Ipsum</p>)
- 隐式标签(例如,裸标签<td>Table data</td>被包裹在 a 中<table><tr><td>...)
- 可靠地创建文档结构(html包含一个head和body,并且只在头部中包含适当的元素)
文档的对象模型
- 文档由 Elements 和 TextNodes 组成(以及其他一些杂项节点:请参阅节点包树)。
- 继承链是:Document extends Element extends Node。TextNode延伸Node。
- 一个元素包含一个子节点列表,并且有一个父元素。他们还提供了仅过滤的子元素列表。
使用 DOM 方法导航Document
问题
您有一个要从中提取数据的 HTML 文档。您大致了解 HTML 文档的结构。
解决方案
Jsoup中的Elements 提供了一系列类似 DOM 的方法来查找元素,并提取和操作它们的数据。 DOM getter 是上下文相关的:在父 Document 上调用它们会在文档下找到匹配的元素; 调用一个子元素,他们会在该子元素下找到元素。 通过这种方式,您可以筛选出您想要的数据。
寻找元素
- getElementById(String id)
- getElementsByTag(String tag)
- getElementsByClass(String className)
- getElementsByAttribute(String key)
- 兄弟元素:
- siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(),previousElementSibling()
- 其他:parent(), children(),child(int index)
元素数据
- attr(String key)获取和attr(String key, String value)设置属性
- attributes()获取所有属性
- id(),className()和classNames()
- text()获取和text(String value)设置文本内容
- html()获取和html(String value)设置内部 HTML 内容
- outerHtml()获取外部 HTML 值
- data()获取数据内容(例如 script和style标签)
- tag()和tagName()
处理 HTML 和文本
- append(String html),
- prepend(String html)
- appendText(String text),
- prependText(String text)
- appendElement(String tagName),
- prependElement(String tagName)
- html(String value)
api文档:https://jsoup.org/apidocs/org/jsoup/nodes/Element.html#getElementsByTag(java.lang.String)
使用选择器语法查找元素
问题
您想使用 CSS 或类似 jquery 的选择器语法来查找或操作元素。
描述
jsoup 元素支持类似于CSS(或jquery)的选择器语法来查找匹配元素,这允许非常强大和健壮的查询。
该select方法在Document、Element或 中可用Elements。它是上下文相关的,因此您可以通过从特定元素中进行选择或通过链接选择调用来进行过滤。
Select 返回一个元素列表 (asElements),它提供了一系列方法来提取和操作结果。
Document doc = Jsoup.connect(src).get();
Elements elements = doc.select("div.item"); Document doc = Jsoup.connect(src).get();
Elements elements = doc.select("div.item");
选择器概述
- tagname: 按标签查找元素,例如a
- ns|tag: 在命名空间中按标签查找元素,例如fb|name查找<fb:name>元素
- #id: 按 ID 查找元素,例如#logo
- .class: 按类名查找元素,例如.masthead
- [attribute]: 具有属性的元素,例如[href]
- [^attr]: 具有属性名称前缀的[^data-]元素,例如查找具有 HTML5 数据集属性的元素
- [attr=value]: 具有属性值的元素,例如[width=500](也可以引用,比如[data-name='launch sequence'])
- [attr^=value],[attr$=value],[attr*=value]: 具有以值开头、结尾或包含值的属性的元素,例如[href*=/path/]
- [attr~=regex]: 属性值与正则表达式匹配的元素;例如img[src~=(?i)\.(png|jpe?g)]
- *: 所有元素,例如*
选择器组合
- el#id: 带有 ID 的元素,例如div#logo
- el.class:具有类的元素,例如div.masthead
- el[attr]: 具有属性的元素,例如a[href]
- 任何组合,例如a[href].highlight
- ancestor child: 继承自祖先的子元素,例如在具有“body”类的块下的任何位置.body p查找元素p
- parent > child: 直接从父元素下降的子元素,例如div.content > p查找p元素;并body > *找到body标签的直接子代
- siblingA + siblingB: 查找紧跟在同级 A 之前的同级 B 元素,例如div.head + div
- siblingA ~ siblingX: 查找在同级 A 之前的同级 X 元素,例如h1 ~ p
- el, el, el: 对多个选择器进行分组,找到匹配任何选择器的唯一元素;例如div.masthead, div.logo
伪选择器
- :lt(n): 查找兄弟索引(即其在 DOM 树中相对于其父级的位置)小于的元素n;例如td:lt(3)
- :gt(n): 查找兄弟索引大于的元素n;例如div p:gt(2)
- :eq(n):查找兄弟索引等于的元素n;例如form input:eq(1)
- :has(selector):查找包含与选择器匹配的元素的元素;例如div:has(p)
- :not(selector):查找与选择器不匹配的元素;例如div:not(.logo)
- :contains(text):查找包含给定文本的元素。搜索不区分大小写;例如p:contains(jsoup)
- :containsOwn(text): 查找直接包含给定文本的元素
- :matches(regex): 查找文本与指定正则表达式匹配的元素;例如div:matches((?i)login)
- :matchesOwn(regex): 查找自身文本与指定正则表达式匹配的元素
- 请注意,上述索引伪选择器是从 0 开始的,即第一个元素在索引 0 处,第二个在 1 处,依此类推
Selector有关完整支持的列表和详细信息,请参阅API 参考。