⌘K 切换工具
NETWORK · HTTP

标题与链接提取工具

按 URL 提取页面的标题结构和全部链接。

server
page-outline

🌐 sitekits fetches the URL server-side (private/internal addresses are blocked). The HTML is parsed as delivered — JavaScript is not executed, so client-rendered headings will not appear.

§01 关于此工具

概述

页面的标题层级就是它的目录,而读取它的东西比多数人以为的要多:构建摘要的搜索引擎、 提供可跳转标题列表的屏幕阅读器、判断页面主题的 AI 回答引擎。层级出错时,这些会同时 退化,而且屏幕上完全看不出来——被排版成小节标题模样的 h3,读起来与 h2 毫无区别。

本工具在服务器端获取 URL,按交付的原样解析 HTML,返回完整的标题树、h1 的数量、 每一处被跳过的层级,以及按内部/外部区分并标出 nofollow 的全部链接。

使用方法

  1. 粘贴 URL。可省略协议,默认按 https 处理。
  2. 阅读摘要行:h1 数量、标题总数、层级跳跃数。
  3. OutlineLinks 之间切换查看明细。

「按交付的原样」是什么意思

不执行 JavaScript。这是刻意设定的约束,而不是需要绕开的限制:它呈现的是所有不执行 脚本的东西所看到的页面。

如果您的标题来自客户端框架,这里的层级会几乎是空的——而这正是结论。搜索引擎确实会 渲染 JavaScript,但按它们自己的节奏且没有保证,而消费您 HTML 的许多其他东西从不渲染: 链接预览、订阅阅读器、文本模式浏览器,以及多数 AI 爬虫。服务器端渲染出的层级,是 所有消费者都能看到的那一个。

<script><style> 的内容以及 HTML 注释在解析前即被移除,因此被注释掉的区块或 模板字符串中的标题不会出现在层级里。标题文本中的标签会被剥除,HTML 实体会被解码, 因此 <h2>Pricing &amp; plans</h2> 读作 Pricing & plans

层级跳跃的读法

只要某个标题比前一个深超过一级就会报告:h1h3,或 h2h5。回到更浅的 层级从不算跳跃——h3 之后的 h2 只是在收束一个小节。

值得在意的原因是,在 HTML 中标题层级是唯一表示嵌套的信号。屏幕阅读器用户按层级 穿行文档,被跳过的一级会告诉他们存在一个内容里并不存在的小节。常见原因是视觉上的: 当初选 h4 是因为字号合适,而那个字号后来又在 CSS 里改掉了。

对策是按结构选层级、用 CSS 定字号。这样层级对所有读者都正确,外观也不受影响。

链接列表的读法

每个链接都按页面的最终 URL 解析,因此相对 href 会以爬虫跟随的绝对 URL 形式出现。 协议相对链接(//host/path)继承页面的协议。格式错误的 href 会被丢弃而不是作为 链接报告。

rel="nofollow" 的检测不区分大小写,且能在多值 rel 属性中识别,因此 rel="NoFollow noopener" 也会被标出。请注意,自 2019 年起 nofollow 对抓取而言是 提示而非指令:它已不再可靠地阻止链接被跟随。如果您原本依赖它把某个 URL 挡在索引之外, 这一点很关键。能做到这件事的只有目标页面上的 noindex

空文本会被明确标出。没有文本的链接——通常是缺少 aria-label 的纯图标锚点——对屏幕 阅读器用户不可达,也不携带任何关于目的地的信号。

示例

  • 审查模板而非页面 — 每个模板跑一个页面。标题缺陷几乎总在模板里,因此少量 URL 就能覆盖整个站点。
  • 确认内容是否服务器端渲染 — 若层级为空而页面上满是标题,那么任何跳过 JavaScript 的东西都读不到它。
  • 迁移之前 — 记录关键页面的层级与链接数,迁移后再比对。丢掉一个 h1、或某个小节 被降了一级,都极容易不被注意地发布出去。
  • 发现意外的外部链接 — 外部列表里混进预发布或 CDN 的主机,通常意味着某个硬编码的 绝对 URL 在部署中存活了下来。
  • 为 AI 回答引擎准备内容 — 正确的标题层级是可用的结构信号中成本最低的一个,也是 最常被破坏的一个。标记错误由 HTML 验证负责,分享时的呈现由 OG 预览负责。

不予统计的内容

只收集 <a href> 元素。<link><form action><iframe src> 与由 JavaScript 驱动的跳转均排除在外,因为它们不是爬虫从文档出发跟随的链接。

说明

最多跟随五次重定向,且每一跳都重新执行同样的地址判定,因此公开 URL 无法重定向进 私有网络。层级描述的是最终响应,同时显示跳转链。

读取到 1 MB 即停止,报告上限为 300 个标题与 500 个链接。达到任一上限都会告知, 因为被静默截断的层级与完整的层级看不出区别。

对私有地址、回环地址、链路本地地址与保留地址的请求,在建立任何连接之前即被拒绝。 响应正文仅在内存中解析以生成本报告,绝不保存——见隐私政策

FAQ
为什么浏览器里能看到的标题这里没有?
因为解析的是服务器交付的 HTML,不执行 JavaScript。页面加载后由客户端框架绘制的标题不会出现。这个差异本身就是有用的信息:不执行您的 JavaScript 的爬虫,看到的正是本工具看到的同一个空层级。
有多个 h1 会影响 SEO 吗?
不会直接影响,HTML5 的分节机制也允许这样做。失去的是明确性:有多个 h1 时,页面在最高层级上没有陈述唯一主题,因此任何要概括它的东西——搜索引擎、屏幕阅读器的标题列表、AI 回答引擎——都得去猜哪一个才是主题。数量只作报告不作评分,判断留给您。
层级跳跃是什么,为什么重要?
指跳过一级的标题,例如 h1 之后直接出现 h3。屏幕阅读器用户按标题层级浏览,被跳过的一级会让层级结构宣称一个内容并不具备的嵌套深度。这是屏幕上看不出来的结构缺陷,因此值得报告。
片段链接和 mailto: 会统计吗?
不会。空 href、页内片段(#top)、javascript: 与 mailto: 均排除在外,因为它们都不是指向页面的链接。其余全部按页面 URL 解析,因此相对链接会以爬虫实际跟随的绝对 URL 形式显示。
内部与外部是怎么判定的?
将解析后链接的主机与重定向后最终 URL 的主机相比较。子域不同即计为外部,因为搜索引擎与浏览器大体也这样处理。
读取的量有上限吗?
响应最多读取 1 MB,最多报告 300 个标题与 500 个链接。若页面超过 1 MB 会明确告知,而不是把一个看起来完整、实际被截断的层级呈现给您。