应使用 domparser 或 jsdom 解析 html 后移除 script/style 节点再提取 textcontent,避免正则替换;node.js 环境推荐 jsdom(容错强、支持不规范 html);cheerio 不构建真实 dom,易误删 json 等内容,不适用于可靠文本提取。

用 DOMParser 解析 HTML 并剥离 <script></script> 和 <style></style> 节点
直接字符串替换(如正则删 <script>.*?</script>)极易出错,会误删含 的文本、破坏嵌套结构或漏掉自闭合写法。正确做法是走 DOM 解析路径,让浏览器/解析器自己处理语法边界。
关键点:必须指定 text/html 类型,否则 DOMParser 可能按 XML 解析,导致对不规范 HTML 报错或丢内容。
- 用
new DOMParser().parseFromString(htmlString, 'text/html')得到文档对象 - 调用
document.querySelectorAll('script, style')批量获取目标节点 - 遍历并调用
.remove()(注意不是.removeChild(),后者需传父节点) - 最后用
document.body?.textContent提取纯文本;若无,回退到document.documentElement.textContent
Node.js 环境下用 jsdom 替代 DOMParser
Node.js 没有原生 DOMParser(除非用 jsdom 或 cheerio)。jsdom 是最接近浏览器行为的选择,尤其对 malformed HTML 容错更强。
注意版本差异:jsdom@20+ 默认禁用脚本执行,但依然会解析 <script></script> 标签内容——所以仍需手动移除节点,不能只靠配置关掉执行。
- 安装:
npm install jsdom - 代码中用
const { JSDOM } = require('jsdom'); - 创建实例后,通过
dom.window.document.querySelectorAll('script, style').forEach(el => el.remove()) - 提取文本优先用
dom.window.document.body?.textContent,避免innerHTML残留标签
为什么不用 cheerio?它不支持完整 DOM 解析
cheerio 是服务端轻量方案,但它不构建真实 DOM,也不执行样式计算、不处理 <noscript></noscript> 或 <template></template> 内容,更不会自动忽略注释中的伪脚本(如 <!-- <script>alert(1)</script> -->)。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
典型问题场景:
- HTML 中有
<script type="application/json">{...}</script>——cheerio会把它当普通标签删掉,导致 JSON 数据丢失 - 使用
<script defer></script>或<script async></script>时,cheerio不区分加载策略,一并清除 - 遇到
<style scoped></style>或<style media="print"></style>,cheerio无法按语义判断是否该保留
除非你明确只要“快速删标签”,且 HTML 结构非常干净,否则别用 cheerio 做文本提取主流程。
提取后还要处理空白和换行?别在 DOM 阶段做
很多人想一步到位得到“干净段落”,于是在 DOM 操作里加 textContent.replace(/\s+/g, ' ').trim()。这会导致语义丢失:比如按钮文字 点击 确认 变成 点击 确认,中间两个空格塌缩为一个,可读性下降;表格单元格间的换行也被抹平。
建议把格式清理作为独立后处理步骤,根据实际用途决定策略:
- 用于搜索引擎索引?保留换行和缩进有助于分段识别
- 喂给 LLM 做 prompt?用
.replace(/\n\s*\n/g, '\n\n')合并空行,再.replace(/[ \t]+/g, ' ')处理行内多余空格 - 生成摘要?先按
\n分割,过滤空行和超短行(如length ),再 join
DOM 层只负责安全剥离不可见元素,文本整形是另一层职责,混在一起容易调试困难、复用性差。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










