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

Java JSoup HTML API:如何让JSoup忽略自定义标签?

解决JSoup自动修正自定义标签的问题

核心思路

JSoup默认的HTML解析模式会严格按照HTML规范修正标签结构(补全闭合标签、调整嵌套等),但自定义标签会被当作普通HTML元素处理,导致不符合预期的修改。要实现保留自定义标签原样,仅处理标准HTML标签,可以通过以下两种方式:

方法1:使用XML解析模式(推荐)

XML解析模式下,JSoup不会自动修正任何标签结构,完全保留原始的标签格式,包括未闭合的自定义标签。这种方式最直接满足需求。

修改解析代码:

// 替换原有的Jsoup.parse调用,使用XML解析器
Document document = Jsoup.parse(yourHtmlContent, "", Parser.xmlParser());

// 后续提取段落的逻辑不变
public String[] getParagraphHTML() {
    Elements paragraphs = document.select("p");
    String[] processed = new String[paragraphs.size()];
    
    for (int i = 0; i < paragraphs.size(); i++) {
        processed[i] = paragraphs.get(i).html();
    }
    return processed;
}

使用这种方式后,<player>标签会完全保留原始状态,不会被添加闭合标签或额外的标签。

方法2:注册自定义标签为非自动闭合元素

如果需要保留JSoup对标准HTML标签的修正能力(比如补全<p>、<strong>等标签的闭合),同时让JSoup忽略自定义标签的修正,可以将<player>注册为非自动闭合的自定义标签:

// 在解析前注册自定义标签
Tag playerTag = Tag.valueOf("player");
// 设置为非自动闭合,JSoup不会自动补全闭合标签
playerTag.setSelfClosing(false);
Tag.register(playerTag);

// 然后正常使用HTML模式解析
Document document = Jsoup.parse(yourHtmlContent);

这种方式下,JSoup会继续处理标准HTML标签的结构修正,但不会对<player>标签进行自动补全。

关于白名单的补充

你提到的Jsoup.clean()和白名单机制,只要正确配置,也可以保留自定义标签:

// 创建白名单并添加自定义标签
Whitelist whitelist = Whitelist.relaxed()
    .addTags("player") // 允许player标签
    .addAttributes("player"); // 如果有属性也可以添加

// 清理时保留自定义标签
String cleanedHtml = Jsoup.clean(originalHtml, whitelist);

但这种方式更适合过滤不安全内容,如果你只是需要保留原始标签结构,XML解析模式更简单可靠。

验证效果

以你提供的原始文本为例:

<u>Oh, hello! You must be the person I've been waiting on all morning. </u><strong><u>You wouldn't happen to be <player> would you?</u></strong>

使用XML解析模式后,提取的段落HTML会完全保留上述原始内容,不会出现额外的</player>或<player>标签。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:50:59