Jsoup解析含大量div的HTML时无法识别闭合标签的解决求助
Jsoup解析含大量绝对定位div的HTML片段时DOM结构混乱的解决办法
问题描述
我有一段包含<div style="position: relative;">容器的HTML字符串,容器内有约200个class为episode-name的div元素,示例结构如下:
<div style="position: relative;"> <div class="episode-name" style="position: absolute; top: 5px;left: 10px;font-size: 30px;" data-id="0_0_0_0">1. Some Text</div> <div class="episode-name" style="position: absolute; top: 5px;left: 10px;font-size: 30px;" data-id="0_0_0_0">2. Some Text</div> ... <div class="episode-name" style="position: absolute; top: 5px;left: 10px;font-size: 30px;"data-id="0_0_0_0">200. Some Text</div> </div>
执行Document document = Jsoup.parse(html)代码解析后,预期生成扁平化DOM结构,但实际Jsoup未识别列表元素的</div>闭合标签,生成了大量嵌套div:
<html> <head></head> <body> <div style="\"position:" relative;\> <div class="\"episode-name\"" style="\"position:" absolute; top: 5px;left: 10px;font-size: 30px;\ data-id="\"0_0_0_0\"">1. Some Unicode</div> ... </div> </div> </div> </div> </body> </html>
这导致DOM结构混乱,极大增加解析难度。请问如何让Jsoup正确解析该HTML片段?
解决办法
1. 修复原始HTML的转义与语法错误
从解析结果看,原始HTML存在两个关键问题:
- 属性值的转义错误(比如
"未正确处理),导致Jsoup解析时属性格式混乱; - 部分标签存在语法问题(如最后一个
episode-name的div中,style属性闭合引号与data-id之间无空格)。
先修正这些问题:
// 还原转义的双引号 String fixedHtml = html.replace(""", "\""); // 修复属性间缺少空格的问题 fixedHtml = fixedHtml.replace("\"data-id", "\" data-id");
2. 使用XML解析模式
如果你的HTML片段结构是严格闭合的XML格式,直接使用Jsoup的XML解析器,避免HTML解析器的容错逻辑导致的嵌套错误:
Document document = Jsoup.parse(fixedHtml, "", Parser.xmlParser());
3. 启用严格HTML解析配置
若需要使用HTML解析器,可开启严格解析模式,关闭Jsoup的容错特性:
ParseSettings strictSettings = ParseSettings.strict(); Parser strictParser = Parser.htmlParser().settings(strictSettings); Document document = Jsoup.parse(fixedHtml, "", strictParser);
4. 验证解析结果
解析完成后,可通过以下代码验证DOM结构是否正常:
// 输出格式化后的HTML,检查结构是否扁平化 System.out.println(document.body().html()); // 统计episode-name元素数量,确认是否正确解析 Elements episodes = document.select(".episode-name"); System.out.println("解析到的剧集数量:" + episodes.size());
内容的提问来源于stack exchange,提问作者user18065631
相关产品推荐
相关产品推荐

