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

Jsoup解析时双引号转&quot、单引号转双引号问题求助

解决Jsoup解析HTML时属性内JSON过度转义的问题

我之前也踩过Jsoup这个过度转义的坑,尤其是属性里包含JSON格式内容的时候,简直头疼!你遇到的情况其实是两个问题叠加:一是Jsoup默认会把属性值的单引号替换成双引号,二是它会把属性内的双引号转成",甚至出现双重转义变成"。光设置prettyPrint(false)确实不够,得从属性引号模式和转义规则两方面入手调整。

试试下面的方案,亲测有效:

1. 调整输出设置,匹配原始属性的引号类型

既然你的原始属性是用单引号包裹的,那我们就让Jsoup输出时也用单引号,这样属性值里的双引号就不需要被转义了(HTML规则里,单引号包裹的属性值可以安全包含双引号,反之亦然)。同时配合宽松的转义模式,只转义必要的HTML特殊字符:

// 解析你的HTML文档
Document doc = Jsoup.parse(yourHtmlContent);

// 配置输出参数
OutputSettings outputSettings = doc.outputSettings();
outputSettings.prettyPrint(false)
              // 强制用单引号包裹属性值,和原始格式一致
              .attributeQuoteMode(AttributeQuoteMode.SINGLE)
              // 使用base转义模式,只转义&、<、>这些必须转义的字符,不碰双引号
              .escapeMode(EscapeMode.base)
              .charset(StandardCharsets.UTF_8);

// 输出处理后的HTML
String fixedHtml = doc.html();

2. 如果还是有问题,手动重置属性值

有时候Jsoup在解析阶段就已经对属性值做了转义,这时候可以手动找到目标元素,重新设置属性值,绕过自动转义逻辑:

// 定位到包含目标属性的元素
Element targetSpan = doc.select("span[span-data-personalization]").first();
if (targetSpan != null) {
    // 获取解析后的原始属性值(Jsoup会自动还原转义后的字符)
    String jsonValue = targetSpan.attr("span-data-personalization");
    // 重新设置属性值,配合上面的输出设置,就能保留原始JSON格式
    targetSpan.attr("span-data-personalization", jsonValue);
}

为什么之前的方法没用?

prettyPrint(false)只是关闭了HTML格式化,完全没涉及引号处理和转义规则。你之前看的方案可能只调整了转义模式,但没同步设置属性引号类型,导致Jsoup还是会把单引号换成双引号,进而触发双引号的转义,最终出现你看到的&amp;quot;这种双重转义结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:54:10