jsoup 1.22.1 现已发布,新增了对re2j正则表达式引擎的支持(用于基于正则表达式的 CSS 选择器),可配置的最大解析深度,以及大量错误修复和改进。
改进
- 新增了对
re2j正则表达式引擎的支持,用于基于正则表达式的 CSS 选择器((例如[attr~=regex], :matches(regex))。这使得处理用户提供的任意查询正则表达式更加安全。要启用此功能,将com.google.re2j依赖项添加到类路径中,例如:
<dependency> <groupId>com.google.re2j</groupId> <artifactId>re2j</artifactId> <version>1.8</version> </dependency>
(如果你的类路径中已经包含了该依赖项,但仍然想使用 Java 正则表达式引擎,可以通过System.setProperty("jsoup.useRe2j", "false")禁用 re2j 。)可以通过调用Regex.usingRe2j()来确认 re2j 引擎是否已正确启用。#2407
- 新增了一个实例方法
Parser#unescape(String, boolean),该方法使用解析器的配置来解转义 HTML 实体(例如,为了支持错误跟踪),作为现有静态实用程序Parser.unescapeEntities(String, boolean)的补充。#2396
- 为 HTML 和 XML 解析器都添加了可配置的最大解析深度(用于限制堆栈中打开的元素数量)。HTML 解析器的默认深度现在为 512,以匹配浏览器行为并防止堆栈无限增长;XML 解析器默认保持无限制深度,但可以通过
Parser.setMaxDepth()选择限制深度。#2421
- Build:添加了对 JDK 25 的 CI coverage #2403
- Build:新增了用于上下文片段解析的 CI 模糊测试器(除了现有的完整 HTML 和 XML 模糊测试器之外)。oss -fuzz #14041
变化
- 为之前已弃用的 API 制定 jsoup 1.24.1 的移除计划。
错误修复
- 先前在
Node#replaceWith(Node)中未正确失效元素的缓存子元素,可能导致后续调用Element#children()时出现错误结果。#2391
- 属性选择器值现采用字面比较且不进行修剪。此前 jsoup 会从选择器值及元素属性值中去除空格,这可能导致与浏览器行为不一致(例如
[attr=" foo "])。现已与 CSS 规范及浏览器引擎保持一致。#2380
- 使用 JDK HttpClient 时,系统默认代理
ProxySelector.getDefault()会被忽略。现已修正:若未设置请求级代理,则使用系统代理。#2388,#2390
- adoption agency 算法在处理严重损坏的输入时可能抛出
ValidationException。现已改为记录为解析错误。#2393
- HTML 正文中的空字符未被一致地移除;外部内容中的空字符也未正确替换。#2395
- 解析经过构造的正文片段时可能抛出
IndexOutOfBoundsException异常。现改为记录为解析错误。 #2397,#2406
- ……
Internal Changes
- 已弃用的内部辅助函数
org.jsoup.internal.Functions(将在 v1.23.1 版本中移除)。#2412
详情可查看更新说明:https://jsoup.org/news/release-1.22.1