首页
/ Jsoup 1.20.1 版本解析:HTML解析与处理的重大升级

Jsoup 1.20.1 版本解析:HTML解析与处理的重大升级

2025-06-04 03:52:59作者:史锋燃Gardner

Jsoup 是一款广受欢迎的 Java HTML 解析库,它能够从各种来源(包括 URL、文件或字符串)解析 HTML,并使用 DOM、CSS 以及类似 jQuery 的操作方法来提取和处理数据。Jsoup 实现了 WHATWG HTML5 规范,能够将 HTML 解析为与现代浏览器相同的 DOM 结构。在最新的 1.20.1 版本中,Jsoup 带来了多项重要改进和功能增强,特别是在 HTML 解析规则、自定义标签支持和性能优化方面。

HTML 解析规则的重大调整

在 1.20.1 版本中,Jsoup 对 HTML 解析规则进行了重要调整,以更好地遵循 HTML5 规范和现代浏览器的实际行为。最显著的变化是默认情况下不再允许自闭合标签(如 <foo />)来闭合 HTML 元素。这一改变使得 Jsoup 的行为更加符合标准,减少了与浏览器行为的差异。

不过,这一规则调整有以下几个例外情况:

  1. 外来内容(如 SVG、MathML)仍然支持自闭合标签
  2. 使用 XML 解析器解析的内容也继续支持自闭合标签
  3. 标准的空元素(如 <img>br 等)不受影响,保持原有行为

对于确实需要特定 HTML 标签支持自闭合的场景,开发者现在可以通过 TagSet 机制进行自定义配置。具体方法是在 Parser.tagSet() 中注册自定义标签,并使用 Tag#set(Tag.SelfClose) 方法设置自闭合属性。

全新的标签自定义机制

Jsoup 1.20.1 引入了一个强大的新功能——通过 TagSet 标签集合来定义自定义标签,并修改已知标签的属性。这一机制不仅影响解析过程,还会影响内容的序列化(输出为 HTML 或 XML)。

开发者现在可以:

  • 创建全新的自定义标签
  • 修改现有标签的属性
  • 控制这些标签在解析和序列化时的行为

这一功能特别适合处理非标准 HTML 或特定领域的标记语言,为 Jsoup 的使用提供了更大的灵活性。

HTML 美化输出器的重构

Jsoup 1.20.1 对 HTML 美化输出器(pretty-printer)进行了全面重构,带来了多项改进:

  1. 实现更加简洁和统一
  2. 输出结果更加一致
  3. 支持自定义标签
  4. 为未来改进提供了更清晰的技术路径

需要注意的是,由于这一重构,新版本生成的美化 HTML 可能与之前版本有所不同。这种变化是积极的,因为它使输出更加符合现代标准和最佳实践。

性能优化与内存改进

Jsoup 1.20.1 在性能方面做出了多项重要优化:

  1. 内存占用减少

    • Element 对象的浅层大小从 40 字节减少到 32 字节
    • NodeList 的浅层大小从 32 字节减少到 24 字节
  2. GC 负载降低

    • 优化了 HTML 输入分词过程中 StringBuilder 的使用,减少了不必要的对象创建
  3. 线程安全性增强

    • 使 Parser 实例线程安全,避免了跨线程使用同一实例导致的错误
    • 对于真正的并发场景,建议使用 Parser#newInstance() 为每个线程创建独立实例

CSS 选择器相关改进

新版本对 CSS 选择器功能进行了多项增强和修正:

  1. 更智能的选择器生成

    • Element.cssSelector() 现在会优先使用祖先元素的 ID(当可用且唯一时)来生成更简短的选择器
    • 例如,现在可能生成 #id > div > p 而不是冗长的 html > body > div > div > p
  2. CSS 标识符转义

    • 现在完全按照 CSS 规范正确处理 CSS 标识符的转义和反转义
    • 新增 Selector.escapeCssIdentifier()Selector.unescapeCssIdentifier() 方法
    • 修正了包含组合字符的 class 或 ID 元素生成选择器的问题
  3. 选择器解析改进

    • 重构了 CSS QueryParser,采用更清晰的递归下降解析器实现
    • 对于连续组合符(如 div >> p)现在会抛出明确的解析异常

XML 处理能力增强

Jsoup 1.20.1 对 XML 处理能力进行了多项改进:

  1. 命名空间支持

    • XML 解析器现在支持作用域限定的 xmlns: 前缀命名空间声明
    • 为 Tag 和 Attribute 正确应用命名空间
    • 新增 Tag#prefix()Tag#localName()Attribute#prefix()Attribute#localName()Attribute#namespace() 方法
  2. XML 序列化改进

    • 包含 XML 1.0 无效字符的元素名称现在会被规范化
    • 序列化为 XML 时,无效字符会被移除而非编码
  3. W3C DOM 转换改进

    • 在未声明命名空间中属性的元素现在会获得 xmlns:prefix="undefined" 声明
    • 这使得通过 W3CDom.asString() 后续序列化为 XML 能够成功

其他功能增强与问题修复

  1. Elements 类新增方法

    • 添加了 deselect() 系列方法,可以从 Elements 列表中移除元素而不影响底层 DOM
    • 新增 asList() 方法获取可修改的元素列表(单个元素仍保持与 DOM 的链接)
  2. 请求体支持

    • 新增 Connection.requestBodyStream(InputStream stream) 支持从 InputStream 发送请求体
  3. 问题修复

    • 修复了 StreamParser 可能重复发出文档最后元素的问题
    • 修正了 XML 解析器在启用错误跟踪时对 <?xml version="1.0"?> 尾部 ? 的错误报告
    • 解决了包含组合字符的 class 或 ID 元素生成选择器不正确的问题

废弃的 API

Jsoup 1.20.1 标记了多个内部组件为废弃状态,这些 API 将在 1.21.1 版本中移除。开发者应尽快迁移使用这些 API 的代码。被废弃的主要包括一些内部工具类和方法,如 ChangeNotifyingArrayListTokenQueue 的多个方法等。

总结

Jsoup 1.20.1 是一个功能丰富且注重细节的版本,在 HTML 解析规则、自定义标签支持、CSS 选择器处理、XML 支持和性能优化等方面都做出了重要改进。这些变化使 Jsoup 更加符合现代 Web 标准,提供了更强大和灵活的功能,同时保持了库的轻量级和高性能特点。对于需要处理 HTML 或 XML 的 Java 开发者来说,升级到 1.20.1 版本将带来更好的开发体验和更可靠的处理结果。

登录后查看全文
热门项目推荐

项目优选

收起
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
138
188
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
187
266
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
892
529
kernelkernel
deepin linux kernel
C
22
6
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
370
387
KonadoKonado
Konado是一个对话创建工具,提供多种对话模板以及对话管理器,可以快速创建对话游戏,也可以嵌入各类游戏的对话场景
GDScript
20
12
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
7
0
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
94
15
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
337
1.11 K
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0