jsoup 1.21.1 现已发布。此版本具有强大的全新节点选择功能,可让用户使用 CSS 选择器锁定特定的 DOM 节点(例如注释和文本节点)、通过新的 TagSet 回调系统进行动态标签自定义,并通过简化的属性转义增强了对突变 XSS 攻击的防御能力。
此版本还默认提供 HTTP/2 支持,并进行了多项 API 改进以提升开发者体验,并修复了多个 edge-case parsing 问题。
Changes
- 删除了以前弃用的方法。#2317
- 由于
:matchText
pseduo-selector 对 DOM 的副作用,已将其弃用;改用新的::textnode
selector和Element#selectNodes(String css, Class<T> type)
方法。#2343 - 已弃用
Connection.Response#bufferUp()
,以代替Connection.Response#readFully()
,后者会抛出一个已检查的 IOException。 - 已弃用的内部方法
Validate#ensureNotNull(Object)
(由 typedValidate#expectNotNull(T)
替代);来自 Attribute 和 Node 的受保护 HTML 附加程序。 - 如果你碰巧正在使用任何已弃用的方法,官方建议立即借此机会迁移它们,因为它们将在未来的版本中被删除。
Improvements
- 增强了
Selector
,支持直接匹配注释和文本节点等节点。#2324 - 新增 TagSet#onNewTag(Consumer<Tag> customizer):注册一个回,当每个新的或克隆的标签插入到集合中时,都会调用该回调函数。该函数支持动态调整标签选项(例如,将所有自定义标签标记为自闭合,或将给定命名空间中的所有内容标记为保留空格)。#2330
- 使
TokenQueue
和CharacterReader
可自动关闭,以确保它们将缓冲区释放回缓冲池,以供以后重用。 - 添加了
Selector#evaluatorOf(String css)
,以更清晰的方式从 CSS 查询中获取评估器。这是QueryParser.parse(String css)
的别名。 - 可以将外部命名空间(例如 SVG)中的自定义标签(通过
TagSet
定义)配置为数据标签进行解析。 - 添加
NodeVisitor#traverse(Node)
以简化节点遍历调用(相对于导入NodeTraversor
)。 - 更新了默认用户代理字符串以提高兼容性。#2341
- HTML 解析器现在允许为已知标签自定义特定的文本数据类型 (Data、RcData)。(之前此功能仅支持自定义标签。)#2326
- 添加了
Connection.Response#readFully()
,以替代Connection.Response#bufferUp()
,并明确了 IOException。同样,添加Connection.Response#readBody()
代替Connection.Response#body()
。已弃用Connection.Response#bufferUp()
。#2327 - 序列化 HTML 时,属性中的
<
和>
字符现在会被转义。这有助于防止一类变异 XSS 攻击。#2337 - 已更改
Connection
为优先使用 JDK 的 HttpClient 而非 HttpUrlConnection(如果可用),以默认启用 HTTP/2 支持。用户可以通过禁用-Djsoup.useHttpClient=false
关闭该功能。#2340
Bug Fixes
svg
外部上下文中的script
内容应被解析为脚本数据,而非文本。#2320Tag#isFormSubmittable()
正在更新标签的选项。#2323- 当文本跟在块元素中的内联元素之后时,HTML pretty-printer 会错误地修剪空格。#2325
- 名称中带有连字符或其他非字母字符的自定义标签现在可以正确用作 Data 或 RcData 标签。它们的结束标签现在也能正确标记。#2332
- 克隆元素时,克隆将保留源的缓存子元素列表(如果有),这可能导致在修改克隆的子元素时出现不正确的结果。#2334
更新说明:https://jsoup.org/news/release-1.21.1