HTML 结构分析
文本所有处理都在浏览器本地完成,数据不上传服务器
⚠️ 它不联网:页面要你自己取(浏览器打开后按 `Ctrl+U` 看源码,或者 `curl -s https://example.com > page.html`)。取下来的是服务端返回的原始 HTML,而不是渲染之后的 DOM —— 这一点对分析脚本、链接、meta 标签来说反而是对的。 这个工具回答的是几个具体问题:这段 HTML 的标题结构是不是完整的?有几张图没写 alt?一共用了多少标签、哪个用得最多?剥掉标签之后正文是什么? 其中最有实际价值的是标题跳级检测。视觉上靠字号是看不出这个问题的 —— 页面看起来完全正常,而屏幕阅读器与搜索引擎正是按这层结构理解页面的。`<h1>` 直接跳到 `<h3>` 会让它们把内容放在错误的层级上。 ⚠️ 关于 HTML 解析,有两点要说清楚: 它不做「纠错」。 浏览器会补上你忘写的 `</div>`、把 `<table>` 里错位的标签挪好。这里的解析器不会 —— 它要看的就是原始文本里写了什么。一个没有闭合的标签是作者需要知道的事实,被解析器悄悄补上就看不见了。代价是它是一个容错的标签切分器,而不是完整的 HTML5 解析器;对这个工具要回答的问题足够了。这个解析器是全站共用的(HTML 转 Markdown、UBB 转换、XPath 三个工具用的都是它),所以同一个页面在任何工具里读出来的结果都一样。 它不判断「页面好不好」。 标题跳级、图片缺 alt 都是提示而不是错误:单页应用的 DOM 由 JS 建出来,静态 HTML 里本来就没有标题,所以没有 `h1` 在这里是正常的。而 `alt=""` 与「没有 alt 属性」是两件不同的事,这里分开统计 —— 后者是漏了,前者是明确声明「这是装饰图」。全部在浏览器本地完成。
功能
- 标题层级:按顺序列出 h1–h6 与各自的文本(标题里的行内标签会穿过,`<h2>Hello <em>world</em></h2>` 读作 `Hello world`)
- ⚠️ 跳级检测:`<h1>` 直接到 `<h3>` 会被指出来并说明为什么这是个问题
- ⚠️ 没有 h1 时说明「单页应用的骨架里这样是正常的」,而不是只给一个 0
- 链接:全部 `<a href>` 的地址与锚文本,并标出外链,附带 `rel` 与 `target`(没有就写「(无)」)
- ⚠️ 链接类型分类:内部 / 外部 / 锚点 / mailto / tel / javascript:(不安全,单独强调)/ 可下载 / 空链接,各类给数量与占比
- 图片:⚠️ 缺 alt 与 `alt=""` 分开统计 —— 前者是漏了,后者是明确的声明
- 标签频次:按出现次数排序并给出占比,看这段 HTML 主要靠什么标签搭起来
- 纯文本:剥掉标签后的正文(script 与 style 的内容不算),块级标签之间换行
- 文档信息:title、lang、meta description、meta viewport
- 统计:字节数、标签总数、正文字数、注释条数
- ⚠️ 不做标签纠错 —— 看的就是原始文本里写了什么,没闭合的标签照样是没闭合
- ⚠️ 属性值里的 `>`、script 里的 `<` 都不会把扫描带偏
使用方法
- 把 HTML 粘进去(整页或片段都行)
- 需要正文就勾上「一并输出剥掉标签后的纯文本」
- 按分组看:文档信息 → 标题层级 → 跳级 → 链接 → 图片 → 标签频次
常见问题
- 为什么不用浏览器的 HTML 解析器?
- 因为解析器会纠正它认为错的 HTML,而分析工具恰恰要看原始文本里写了什么。一个没有闭合的 `<div>`、一个写在 `<table>` 里错位的标签,都是作者需要知道的事实 —— 被解析器悄悄补好就看不见了。另外,这个站的转换类工具一律是纯函数,一碰 `document` 就没法在没有浏览器的环境里测,所以全站共用一个不依赖 DOM 的解析器(HTML 转 Markdown、UBB 转换、XPath 三个工具用的也是它)。它不追求实现完整的 HTML5 解析算法,只做标签与文本的切分,这一点页面上写明了。
- 「没有 alt」和「alt=""」有什么不同?
- 区别很大。缺 alt 属性是漏了:屏幕阅读器不知道这张图是什么,只能把文件名念出来(「IMG_2043.jpg」)。而 `alt=""` 是明确的声明:「这是一张装饰图,读它没有意义」,屏幕阅读器会跳过它。把两者并成一类,会让一个正确写了 `alt=""` 的页面看起来和漏写的一样糟 —— 而修复方向恰恰相反:前者要补描述,后者要保持原样。
- 为什么没有 h1 有时候是正常的?
- 因为单页应用的 HTML 往往只是一个骨架:内容与标题都由 JavaScript 在浏览器里建出来,服务端发出的这份 HTML 里本来就没有 `<h1>`。搜索引擎对这种情况有自己的处理方式。而对服务端渲染的文档或博客文章来说,没有 h1 多半就是漏了。这个工具没法替你判断你的页面属于哪一种,所以只把两种可能都说出来。
- 标签频次有什么用?
- 用来一眼看出这段 HTML 是怎么搭起来的。一段满是 `<div>` 的片段说明布局靠容器堆;`<table>` 很多说明是表格或老式的布局;`<span>` 异常多通常是从编辑器里粘出来的产物,往往可以简化。它只给数量,不做评价 —— 数量本身不说明好坏,但它是继续往下看的线索。
- 剥出来的纯文本能直接拿去用吗?
- 看用途。它是「这段 HTML 大致讲了什么」的忠实摘要,用来做字数统计、提取摘要、或者快速看内容都在。但它不是渲染结果:CSS 里的 content、JS 动态插入的文本、`:before` 伪元素都不会出现。要精确的渲染文本,用浏览器的「查看源码」或者无头浏览器。
- 为什么 `javascript:` 链接要单独标出来?
- 因为它是这张分类表里唯一有安全含义的一类。`<a href="javascript:...">` 会在点击时执行脚本,是 XSS 的常见入口,也常常是模板拼接出错的痕迹。别类链接最多是风格问题,而它可能是一个真实的漏洞 —— 所以它单独成一类、显示为红色,并附一句说明,而不是混在「其它」里。
相关工具
HTML 实体编解码
编码把 < > & 与引号转成 HTML 实体,也能把实体还原成字符,而且只解一遍:&lt; 得到的是 < 而不是尖括号。全部在浏览器本地完成。
正则测试
文本浏览器里调试正则:匹配实时高亮、捕获组、替换预览,并挡住灾难性回溯;调好可生成 JavaScript、Python、Java、Go、PHP 代码,反向引用按语言转换。
文本体检
文本找出文本里看不见的零宽字符、BOM、同形异码字符,并报出规范化形式、行尾类型与四种字数统计。全部在浏览器本地完成。
文本对比
文本把两份文本逐行对比,高亮标出新增、删除与未改动的行,改动按最小差异对齐,而不是整段标成变了。全部在浏览器本地完成,内容不上传。
字数统计
文本中英混排的文本到底有多长?中文按字、英文按词分开统计,给出字符数、行数、字节数、阅读与朗读时长,以及会被切成几条短信。全部在本机完成。
文本清洗
文本清洗从日志或表格里复制出来的一列内容:去重行、排序、去空行、去首尾空白、去行号、合并多空格,规则逐条开关。粘贴的内容只在本机处理。