You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jsoup避免自动转义问题:提取HTML时保留原始实体而非可视化文本

解决Jsoup输出时丢失原始HTML实体的问题

我完全懂你的困扰——Jsoup默认会把HTML实体转成对应的可视化字符,导致你拿不到原始的实体字符串。咱们一步步来搞定这个问题:

问题根源

Jsoup在解析HTML时,会自动把所有实体(比如&amp;、&acirc;&#128;&#148;)转换成对应的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;实体,再加上&被转义成&amp;,最终就还原了原始的&amp;acirc;&amp;#128;&amp;#148;格式。

如果原始HTML用的是UTF-8字符集,把上面的ISO_8859_1换成UTF_8即可,但要注意UTF-8下—对应的实体是&mdash;,如果你确实需要原始的&acirc;&#128;&#148;,那必须用ISO-8859-1字符集。

内容的提问来源于stack exchange,提问作者TheCodeKiller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:06:41