在前文探讨 AI 解析语义树的原理时,我们指出一个普遍痛点:许多前端代码仍使用无意义的<div>堆砌页面结构。这导致 AI 爬虫难以区分正文与广告,极易造成优质内容被误判丢弃。为打破这一困境,本文将聚焦<main>标签,深度拆解其规范用法与 GEO(生成式引擎优化)策略。作为页面骨架的核心,<main>能直接告知 AI“此处即正文”,掌握其正确写法是提升内容被 AI 精准锁定的关键。
main 标签:全局唯一的核心内容锚点
<main>元素的唯一职责是标识文档的主体内容(dominant content),必须包含与文档中心主题直接相关或扩展该主题的信息。在无障碍访问规范中,它等价于 role="main"。
在 GEO 网站开发中,开发者常混淆 body、article 和 main。可通过“剧院模型”清晰区分:
- body:剧院的建筑外壳,即整个文档容器;
- main:舞台中央的核心表演区,即主体内容锚点;
- article:舞台上独立上演的一出戏剧,即可独立引用的知识单元。
三者层级与职责截然不同,不可互相替代。main 是网页的绝对主角,无论页面如何变化,其内部应始终承载最核心的干货,严禁混入菜单、侧边栏或广告等辅助信息。
main 标签的使用原则
原则一:一个文档只能有一个可见的 main
规范明确指出,文档中不能有多个可见的<main>。“可见”指未使用 hidden 属性、display: none 或离屏定位等 CSS 隐藏手段。在 Tab 切换面板或 SPA 单页应用路由场景中,未激活的面板或路由对应的<main>必须添加 hidden 属性,确保 AI 爬虫和屏幕阅读器仅识别全局唯一的活跃主体。
原则二:不能嵌套在节段性容器内
<main>的祖先节点不能是<article>、<aside>、<nav>或<section>。若将<main>置于<article>内部,HTML 校验器将报错。因为节段性容器拥有独立主题,而<main>代表整篇文档的主题,两者逻辑冲突。
原则三:不是全站共用区域的容器
Logo、全局导航、搜索框、广告位、版权声明等全站复用内容,严禁放入
main 标签在 GEO 优化中的核心作用
在 GEO 视角下,<main>是 AI 进行文本分块时权重最高的区域。大模型处理网页时,会将该标签内的文本视为核心答案候选区,这与 LLM 的注意力机制高度契合,即 main 内的 token 会获得比页头、页脚更高的注意力分配。
此外,<main>与 Schema.org 的 WebPage 或 Article 存在天然映射关系。在列表页中,配合 article 标签标注卡片,能让 AI 清晰识别集合型主体,从而在回答“有哪些优秀开源项目”类问题时,优先提取 main 内的列表数据。
main 标签在 GEO 优化中的五大经典应用
应用一:赋予 id="content"并配置 Skip Link
给
错误写法:缺乏语义锚点
<body>
<nav>...</nav>
<main>
<h1>核心标题</h1>
<p>正文内容...</p>
</main>
</body>
此写法虽使用了语义标签,但缺乏唯一 ID 标识。AI 爬虫无法通过锚点快速定位,必须遍历整个 DOM 树确认正文边界,增加了被截断或误判的风险。
正确写法:语义锚点 + Skip Link 双重保障
<body>
<a href="#content" class="skip-link">跳转到正文</a>
<nav>...</nav>
<main id="content">
<h1>核心标题</h1>
<p>正文内容...</p>
</main>
</body>
<style>
.skip-link {
position: absolute;
top: -40px;
left: 0;
background: #000;
color: #fff;
padding: 8px;
z-index: 100;
transition: top 0.3s;
}
.skip-link:focus {
top: 0;
}
</style>
通过 CSS 将链接移出可视区域但不脱离 DOM,既不影响视觉体验,又供 AI 和屏幕阅读器读取。id="content"与链接 href 完美对应,使 AI 能直接将此节点标记为高权重正文区。
应用二:首屏 300 字必须包含 H1 与核心结论
大语言模型存在“首因效应”及上下文窗口截断问题,对文本开头的注意力权重远高于中后部。若核心结论藏在 main 底部,极易因 Token 限制或注意力衰减而被忽略。因此,main 内前 100-300 字必须包含 h1 标签及直接回答用户意图的核心结论。
错误写法:核心结论后置
<main id="content">
<h1>如何优化 GEO</h1>
<p>在探讨 GEO 优化之前,我们需要了解什么是生成式引擎优化,它的历史背景以及与传统 SEO 的区别...</p>
<!-- 500 字背景介绍 -->
<p>综上所述,GEO 优化的核心在于结构化数据与语义对齐。</p>
</main>
此写法中,AI 在阅读大量背景铺垫后注意力已被稀释,待核心结论出现时,可能已处于上下文遗忘区,导致生成摘要时被截断或降权。
正确写法:结论前置 + 倒金字塔结构
<main id="content">
<h1>如何优化 GEO:核心在于结构化与语义对齐</h1>
<p>GEO 优化的核心策略是:在 main 标签内采用“结论先行”结构,确保前 100 字包含核心答案,并配合 Schema.org 结构化数据。</p>
<p>在探讨具体操作前,我们需要理解 GEO 与传统 SEO 的本质区别...</p>
</main>
标题直接包含关键信息,首段开门见山给出操作指南。这种倒金字塔结构既契合 AI 的前置偏好,确保核心答案不被截断,也保留了人类读者的阅读连贯性。
应用三:DOM 内容与 JSON-LD 严格对应
AI 爬虫会同时读取 HTML DOM 树和 JSON-LD 结构化数据。当两者描述高度一致时,会产生双重印证的信任感。若 main 标签圈定的正文范围与 JSON-LD 中 WebPage.mainEntity 声明不一致(如 main 内是产品列表,JSON-LD 却声明为博客文章),AI 会产生认知冲突,降低页面可信度。
错误写法:DOM 与 JSON-LD 语义割裂
<main id="content">
<article>
<h2>2026 年 GEO 优化指南</h2>
<p>这是一篇关于 GEO 的深度技术文章...</p>
</article>
</main>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "公司首页",
"mainEntity": {
"@type": "Organization",
"name": "某某科技公司"
}
}
</script>
DOM 显示为技术文章,JSON-LD 却指向组织机构,这种自我矛盾会导致 AI 在引用该页面时犹豫不决。
正确写法:DOM 与 JSON-LD 完美映射
<main id="content">
<article>
<h2>2026 年 GEO 优化指南</h2>
<p>这是一篇关于 GEO 的深度技术文章...</p>
</article>
</main>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "2026 年 GEO 优化指南",
"mainEntity": {
"@type": "TechArticle",
"headline": "2026 年 GEO 优化指南",
"articleBody": "这是一篇关于 GEO 的深度技术文章..."
}
}
</script>
HTML 中的<article>与 JSON-LD 中的 TechArticle 类型完美对应,headline 与 articleBody 进一步映射核心文本。这种双重印证机制可将页面的引用优先级提升至最高。
应用四:解决 SPA/SSR 场景下的时序问题
在 React、Vue 等单页应用中,若 main 内容依赖 JS 执行后渲染,部分 AI 爬虫可能因不执行或不完全执行 JS 而抓取到空标签。必须确保 main 在服务端渲染(SSR)阶段即包含核心内容,或提供可靠的 Hydration Fallback 方案。
错误写法:纯 CSR 导致 AI 抓取空壳
<!-- 服务端返回的 HTML -->
<main id="content"></main>
<!-- 客户端 JS 执行后 -->
<script>
document.getElementById('content').innerHTML = '<h1>核心标题</h1><p>正文内容</p>';
</script>
服务端返回空 main,AI 首次抓取时会判定为“无实质内容”。虽然后续 JS 渲染了内容,但 AI 抓取时序往往早于渲染完成,造成人类看到完整页面而 AI 看到空壳的致命伤。
正确写法:SSR + Hydration Fallback
<!-- 服务端渲染的完整 HTML -->
<main id="content">
<h1>核心标题</h1>
<p>正文内容...</p>
</main>
<!-- 客户端 Hydration -->
<script>
// React/Vue 接管已有 DOM,而非重新创建
hydrateApp(document.getElementById('content'));
</script>
SSR 输出包含完整内容的 main,确保 AI 无论是否执行 JS 都能读取核心信息。客户端 JS 仅负责接管而非覆盖 DOM,保证了抓取内容与用户所见完全一致,彻底消除 SPA 场景下的 GEO 盲区。
应用五:显式声明 ARIA role="main"
虽然<main>隐含 role="main",但在复杂布局或遗留系统中,若 main 被嵌套在非标准结构(如自定义 div)内,可能导致语义被弱化。此时显式添加 role="main"可作为安全网,防止语义被上下文污染。
错误写法:嵌套非标准结构且无显式 role
<div class="custom-layout">
<main id="content">
<h1>核心标题</h1>
<p>正文内容...</p>
</main>
</div>
在某些 AI 解析器中,非语义化父级容器可能干扰 main 的角色识别,尤其在 DOM 结构复杂时风险更高。
正确写法:显式声明 role="main"
<div class="custom-layout">
<main id="content" role="main">
<h1>核心标题</h1>
<p>正文内容...</p>
</main>
</div>
显式声明覆盖了任何可能的上下文歧义,遵循防御性编程思想,确保 AI 和辅助技术在任何情况下都能准确识别主要内容区。
GEO 优化策略总结
将 main 标签视作向 AI 汇报的主舞台,需遵循以下五点策略:
- 挂门牌:添加 id="content"和跳转链接,明确指示重点,避免 AI 在导航栏浪费时间。
- 开场炸:前 100 字必须抛出结论,利用 AI 的首因效应,防止关键信息被遗忘。
- 言行一致:main 内容须与 JSON-LD 声明完全匹配,杜绝表里不一,建立 AI 信任。
- 别迟到:SPA 页面务必实施 SSR,确保 AI 抓取时主舞台已有内容。
- 穿对衣:在复杂布局中显式添加 role="main",确保 AI 无论何种视角都能识别主角身份。
落实这五点,main 标签将从普通 HTML 元素升级为 AI 眼中的高价值答案宝库。
下期预告
掌握<main>标签后,我们将进一步深入页面头部<header>。下一篇将拆解 header 在全站级、文章级、章节级三种场景中的应用,解析其如何承载作者信息、发布时间、面包屑导航等元数据,并与 Schema.org 的 author、datePublished 等属性协同,帮助 AI 快速建立对内容权威性的信任。

