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

如何解决jsoup解析含<符号的文本时输出错误HTML的问题

Jsoup解析未转义尖括号错乱问题解决方案

问题根因

Chrome和jsoup的HTML容错规则不一致:Chrome内置解析器会判断<后第一个字符,若不是ASCII英文字母,就将该<视为普通文本处理;jsoup默认解析器会将所有<开头的内容尝试作为标签解析,因此会把<虎识别为自定义标签,最终导致解析结构错乱。

解决方法

无需修改源代码中的<字符,调整jsoup解析配置即可:

  • 1.14.2及以上版本jsoup,直接关闭非ASCII标签识别权限即可和Chrome逻辑对齐:
import org.jsoup.Jsoup;
import org.jsoup.parser.Parser;
import org.jsoup.parser.ParseSettings;
import org.jsoup.nodes.Document;

// 初始化符合Chrome容错规则的自定义解析器
Parser parser = Parser.htmlParser();
ParseSettings settings = new ParseSettings(false, false);
settings.setAcceptNonAsciiTags(false);
parser.settings(settings);

// 用自定义解析器解析原始HTML
Document doc = parser.parse(你的原始HTML字符串, "");
  • 低版本jsoup可通过遍历修正异常标签:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.TextNode;
import org.jsoup.select.NodeVisitor;

Document doc = Jsoup.parse(你的原始HTML字符串);
doc.traverse(new NodeVisitor() {
    @Override
    public void head(Node node, int depth) {
        // 匹配非ASCII开头的异常自定义标签
        if (node instanceof Element && !node.nodeName().matches("^[a-zA-Z][a-zA-Z0-9_-]*$")) {
            // 替换为普通文本,补回<符号
            node.replaceWith(new TextNode("<" + node.nodeName() + node.html()));
        }
    }
    @Override
    public void tail(Node node, int depth) {}
});

两种方案处理后,jsoup输出的HTML结构就会和Chrome渲染结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:06:04