最轻量可靠的方式是用 document.body.innertext 获取纯文本,它自动过滤隐藏元素、合并空白符,比 textcontent 更贴近用户实际阅读效果;后续需按中英文特点分词统计,并用 map 存储频次。

直接用 document.body.innerText 获取纯文本,再按需切分统计——这是最轻量、最可靠的方式,不依赖外部库,也不怕标签嵌套或动态内容干扰。
用 innerText 提取文本比 textContent 更贴近真实阅读效果
innerText 会忽略 script、style、不可见元素(如 display: none)里的内容,且自动合并空白符、换行符,结果更接近用户实际看到的文本。而 textContent 是“原样吐出”所有文本节点,包括注释、隐藏元素内的文字,容易混入噪声。
- 如果页面有大量隐藏区块或广告脚本,
innerText能天然过滤掉它们 - 对中文段落,
innerText自动处理换行和缩进,避免手动.replace(/\s+/g, ' ') - 注意:
innerText是只读属性,不能赋值;它在 iframe 跨域时可能返回空字符串
按字/词统计时,切分逻辑决定结果是否合理
HTML 文本提取后是字符串,怎么切,直接影响统计意义。英文可按空格+标点拆,中文必须用分词工具,否则单字统计毫无语义。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 统计单字(适合字符频率分析):
text.split(''),但要先.replace(/[\s\uFEFF\xA0]+/g, '')去掉空白 - 统计中文词(推荐):引入
jieba-js或服务端分词,前端直接用正则text.match(/[\u4e00-\u9fa5]+/g)只取连续汉字(简单但漏掉数字、英文混合词) - 统计英文单词:用
text.toLowerCase().match(/\b[a-z]+\b/g),\b确保边界准确,避免匹配到邮箱或路径中的字母串
Map 比对象字面量更适合做频次统计
用 Map 存储词→次数映射,能保留原始类型(比如数字 123 和字符串 "123" 不会冲突),也支持任意键(包括对象、函数),遍历顺序稳定。
- 初始化:
const freq = new Map() - 更新:
freq.set(word, (freq.get(word) || 0) + 1) - 取最高频:
[...freq.entries()].reduce((a, b) => a[1] > b[1] ? a : b) - 别用
{}直接当哈希表——遇到__proto__、constructor这类属性名会出问题
真正难的不是提取或计数,而是定义“什么是有效文本”:要不要保留表格中的数字?要不要跳过页脚版权行?这些业务规则没法靠通用 API 解决,得在 innerText 后加一层 DOM 定位过滤,比如先 document.querySelector('main')?.innerText 或排除 footer 元素。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










