如何解决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
相关产品推荐
相关产品推荐

