Jsoup避免自动转义问题:提取HTML时保留原始实体而非可视化文本
解决Jsoup输出时丢失原始HTML实体的问题
我完全懂你的困扰——Jsoup默认会把HTML实体转成对应的可视化字符,导致你拿不到原始的实体字符串。咱们一步步来搞定这个问题:
问题根源
Jsoup在解析HTML时,会自动把所有实体(比如&、—)转换成对应的Unicode字符。当你输出内容时,它又只会转义HTML必需的特殊字符(比如<、>),像—这种字符不会被转回原始的实体组合,所以你看到的是可视化版本而非原始HTML代码。
解决方案
要保留原始的实体格式,你需要调整解析时的字符集和输出时的转义规则:
1. 解析时指定匹配的字符集
首先确保Jsoup用和原始HTML一致的字符集解析内容(从你的原始实体来看,大概率是ISO-8859-1):
Document doc = Jsoup.connect(myLocation) .charset(StandardCharsets.ISO_8859_1) // 匹配原始HTML的字符集 .get();
2. 配置输出参数
修改输出的转义模式和字符集,让Jsoup把所有字符都转义成对应的实体:
doc.outputSettings() .indentAmount(0) .prettyPrint(false) .escapeMode(EscapeMode.extended) // 转义更多非ASCII字符为实体 .charset(StandardCharsets.ISO_8859_1); // 和解析时的字符集保持一致
3. 提取目标内容
之后再提取指定区域的内容:
final Element docContent = doc.selectFirst("#docContent"); return docContent.html();
为什么这样生效?
EscapeMode.extended会让Jsoup转义更多非ASCII字符为实体,而不是保留为Unicode字符。- 指定
ISO_8859_1字符集后,—这个Unicode字符会被拆分成三个字节,每个字节对应你原始HTML里的â、€、”实体,再加上&被转义成&,最终就还原了原始的&acirc;&#128;&#148;格式。
如果原始HTML用的是UTF-8字符集,把上面的ISO_8859_1换成UTF_8即可,但要注意UTF-8下—对应的实体是—,如果你确实需要原始的—,那必须用ISO-8859-1字符集。
内容的提问来源于stack exchange,提问作者TheCodeKiller
相关产品推荐
相关产品推荐

