必须为每个搜索结果项单独使用标签包裹,且内部须含–标题;整页结果不可用一个统包,否则因语义不符被降权或跳过。

直接说结论:<main></main> 必须包裹全部可索引内容,<article></article> 每条结果只能包一个完整、自包含的检索项,且必须含 <h2></h2> 或更高级别标题;否则搜索引擎会降权或跳过该区块。
为什么 <article></article> 不能套在搜索结果列表外层
常见错误是把整个搜索结果页用一个 <article></article> 包起来,比如:
<article><h1>搜索结果:HTML语义化</h1> <div class="results">...</div> </article>
这违反了 <article></article> 的语义定义——它表示“可独立分发、可被 RSS 订阅、可单独索引”的内容单元。整页结果不是一篇内容,而是多个候选项的集合。正确做法是每个结果项各自为一个 <article></article>。
- 每个
<article></article>内部必须有且仅有一个<h2></h2>–<h6></h6>标题(如结果标题),否则会被视为语义不完整 - 如果结果无标题(如纯图片/卡片无文字),应改用
<section></section>+aria-labelledby,而非硬塞空<h3></h3> -
<article></article>不可嵌套在另一个<article></article>中,也不应出现在<nav></nav>或<aside></aside>内
<main></main> 里不能出现 <header></header> 或 <footer></footer> 吗
可以,但必须是逻辑子区域的头部/尾部,不是页面级的。例如搜索页中,“筛选条件区”顶部加一个 <header></header> 是合理的,但它的 role 会自动变为 group 而非 banner,因为不在 直接子级。
- 页面级
<header></header>和<footer></footer>只能是的直接子元素,否则语义降级 -
<main></main>内允许<header></header>,但仅限于该主内容区内部的局部标题块(如“相关推荐”区块的标题栏) - 若在
<main></main>里放了<footer></footer>,浏览器会将其role解析为contentinfo,但搜索引擎可能忽略——因它本不该出现在主内容流末尾
搜索结果页的 <time></time> 标签怎么写才有效
很多页面用 <time>发布时间</time>,但没加 datetime 属性,机器根本无法解析。搜索引擎和屏幕阅读器只认 ISO 8601 格式值。
- 必须写成
<time datetime="2026-06-05T14:22:00+08:00">2026年6月5日</time>,不能是"2026/06/05"或"5天前" - 如果结果来自 API 动态渲染,
datetime值必须由后端或 JS 生成真实时间戳,不能留空或填占位符 - 对聚合类结果(如“近一周热门”),不用
<time></time>,改用<span>近7天</span>即可——它本就不是精确时间点
为什么用 <section></section> 划分筛选条件比 <div> 更利于检索
<p>因为 <code><section></section> 是“主题性分组”,浏览器和爬虫会把它当作一个语义单元处理;而 <div> 是纯容器,无任何结构信号。
<ul>
<li>每个 <code><section></section> 应带明确标题,如 <h3>按时间范围筛选</h3>,否则语义断裂
<section></section> 包按钮组或单个输入框——那是交互控件,用 <form></form> 或 <fieldset></fieldset> 更合适<section></section> 并列时,层级必须扁平(避免 <section><section>...</section></section>),否则影响爬虫提取深度最容易被忽略的是:动态加载的搜索结果,即使 DOM 中补全了 <article></article> 和 <time></time>,若初始 HTML 源码为空(如只留 <main id="results"></main>),搜索引擎仍可能只索引骨架,不抓取 JS 渲染后的内容。服务端渲染或静态预生成仍是语义化检索页的底线要求。











