JSoup 是最可靠HTML解析库,自动修复畸形HTML;提取文本需先parse再body().text(),删script/style后再text();Hutool HtmlUtil轻量但容错弱;禁用正则清洗HTML;清洗后须校验隐藏字符。

用 JSoup 解析并清洗 HTML 内容
JSoup 是 Java 生态中最可靠、最容错的 HTML 解析库,它不依赖浏览器环境,能自动修复 malformed HTML(比如缺失闭合标签、嵌套错误),适合做服务端内容清洗。直接调用 text() 会递归提取所有文本节点,但会丢弃结构信息;若需保留部分语义(如段落分隔),应遍历 Element 节点手动处理。
常见错误:用 Document.body().text() 提取时,如果原始 HTML 没有 标签(纯片段),会返回空字符串——正确做法是先用 Jsoup.parse(html) 得到完整 Document,再调用 document.body().text() 或 document.text()。
- 对含 script/style 的页面,
document.select("script, style").remove()必须在text()前执行,否则脚本内容也会被当作文本提取 - 实体字符(如
)会被自动转义,无需额外调用Jsoup.unescapeEntities() - 若 HTML 来自不可信来源,务必启用
Whitelist过滤,例如Jsoup.clean(dirtyHtml, Whitelist.none())防 XSS
Hutool 的 HtmlUtil 做轻量级清洗
如果你项目已引入 Hutool,且只需简单去标签、删广告块或过滤属性, 典型误用: 正则匹配 HTML 标签(如 唯一可接受正则的场景:你**完全控制输入格式**,且 HTML 是严格扁平、无嵌套、无属性的简易标记(例如内部系统生成的 xxx 清洗不是终点,得确认输出符合预期。最易被忽略的是:清洗后的文本是否仍含隐藏控制字符、零宽空格、BOM、或不可见 Unicode 符号(如 建议在清洗后加一层校验逻辑:HtmlUtil 是更轻量的选择。它不构建 DOM 树,而是基于正则和字符串操作,速度快但容错弱——遇到严重 malformed HTML(如未闭合的 HtmlUtil.removeHtmlTag(html, "div") 会删除所有 HtmlUtil.unwrapHtmlTag(html, "div")。
cleanHtmlTag() 适合日志摘要、搜索索引等纯文本场景,但会把换行、空格全压成单空格filter() 默认只放行基础标签(p, br, strong 等),要保留 img 需显式加白名单:HtmlUtil.filter(html, Whitelist.simpleText().addTags("img"))
HtmlUtil 不识别它们,可能把 当普通文本原样留下避免用正则直接清洗 HTML
]+>)在多数真实场景下会失效:无法处理嵌套、属性值含 >(如 title="a > b")、注释、CDATA、自闭合标签变体( vs )。JSoup 和 Hutool 底层都用状态机解析,这才是安全前提。)。即便如此,也建议先用 yyy
Jsoup.parse(html).body().html() 归一化后再正则处理。
String.replaceAll("]*>", "") 清洗,遇到 就会把 
src="a 之后全删掉,容易误删中间内容
&, ")需额外反转义,而 JSoup/Hutool 在解析阶段就已完成清洗后如何验证是否“干净”
\u200e LTR mark)。这些字符肉眼不可见,但会影响后续 NLP 分词或数据库存储。
cleanText.codePoints().anyMatch(cp -> cp > 0x7F && cp 快速扫出非 ASCII 控制符
\u3000(全角空格)或 \u2028(行分隔符),它们常被误认为普通换行cleanText.trim().isEmpty() 判断是否整段被清空——这往往意味着原始 HTML 是 script 标签包裹的 JSON 或 base64 数据,而非可视内容
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











