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
相关产品推荐
相关产品推荐

