Jsoup解析表格内嵌套p标签的HTML时p标签错误闭合问题
Jsoup 解析后出现空 p 标签的原因
- 核心原因是HTML 规范本身禁止 p 标签嵌套。根据 W3C 标准,
<p>标签的内容模型仅允许包含文本、行内元素等短语内容,不允许嵌套另一个块级的<p>标签。所有遵循HTML解析规范的解析器,遇到非法嵌套的 p 标签时,都会自动修正结构,而非原样保留错误写法。 - Jsoup 默认使用遵循WHATWG HTML解析规范的解析器,处理逻辑如下:
- 解析到外层
<p>开标签后,遇到内层的<p>开标签时,会自动隐式闭合尚未结束的外层<p>,因此最开始的外层<p>会变成一个空的开-闭标签对 - 后续遇到最外层对应的
</p>闭合标签时,由于没有匹配的未闭合<p>开标签,解析器会自动将其转换为一个新的空<p>标签 - 最终表现为td内多出两个无内容的空p标签,和实际解析结果吻合。
- 解析到外层
对应解决方案
根据实际业务场景选择对应处理方式:
- 可修改待解析原始HTML的场景
直接从源头修正非法结构,去掉 p 标签的嵌套写法,把需要分层的内容用<div>等合规标签包裹,或者拆分为同级的 p 标签,从根源上避免触发解析器的自动修正逻辑。 - 必须保留原始HTML非法嵌套结构的场景
解析时放弃默认的HTML解析器,改用严格匹配标签开闭关系的XML解析器,对应调用代码为:Jsoup.parse(原始HTML字符串, "", Parser.xmlParser())
这种解析模式不会自动按照HTML规则做标签修正,会原样保留 p 标签嵌套的原始结构。 - 仅需清理多余空p标签的场景
解析完成后,直接遍历文档删除所有无实际文本内容的空 p 标签,对应选择器写法为:doc.select("p:matchesOwn(^\\s*$)").remove()
执行后即可得到无空p标签的干净输出。
内容的提问来源于stack exchange,提问作者César Castro Aroche
相关产品推荐
相关产品推荐

