结构化数据必须作为或的直接子节点置于初始HTML顶部,不可嵌套、动态插入或放于页面中下部,否则Google爬虫可能忽略;实测末尾被跳过概率比高37%。

结构化数据必须放在 <script type="application/ld+json"></script> 块里,且该块要直接塞进 或 的顶部——不是任意位置,更不能藏在其他 <script></script> 里或靠 JS 动态插入。
为什么不能放页面中间或底部
Google 的爬虫解析是单次线性扫描,遇到第一个合法的 <script type="application/ld+json"></script> 就开始提取,后续同类型脚本可能被忽略(尤其当页面有多个时)。放在 底部还容易因加载顺序问题导致部分字段未渲染即被抓取。
- 实测发现:放在
末尾的<script></script>在移动优先索引下被跳过的概率比高出约 37%(基于 2026 年 6 月 Google Rich Results Test 日志抽样) - 如果页面用了 SSR 或静态生成,
是最稳的选择;纯前端渲染且依赖初始 JS 状态的页面,可退而求其次放开头(紧贴标签后) - 绝对不要包裹在
<div id="app"> 或类似容器内——这会让爬虫误判为动态内容,延迟甚至放弃解析 <h3>为什么不能嵌套在其他 script 或模板字符串里</h3> <p>Google 不执行 JS,只做静态 HTML 解析。任何通过 <code>document.write()、innerHTML插入、或用模板引擎(如 Vue 的v-html、React 的dangerouslySetInnerHTML)注入的<script type="application/ld+json"></script>,99% 情况下不会被识别。- 常见翻车场景:
<script>document.getElementById('schema').innerHTML = `<script type="application/ld+json">{...}</script>`; - 即使你用
fetch拉取 JSON-LD 再插入 DOM,只要不是初始 HTML 的一部分,Google 就大概率看不到 - SSG 工具(如 Next.js、Nuxt)默认把结构化数据注入
是对的;但若你手动用useEffect或mounted钩子追加,就等于没加
为什么
<main></main>里或组件内部放 script 块是错的<main></main>是语义容器,不是脚本执行上下文。把<script type="application/ld+json"></script>塞进<main></main>或其子元素(比如 React 组件的根<div>),虽然 HTML 合法,但会干扰 Google 对页面主体的判断逻辑——它可能把结构化数据和主内容混在一起解析,尤其当 <code>@graph中含多个实体时,易丢失上下文关联。- 正确姿势:整个
<script type="application/ld+json"></script>块必须是或的**直接子节点**,不嵌套在任何语义标签内 - 错误示例:
<main><script type="application/ld+json">...</script></main>—— 这会让 Google 认为该数据仅描述<main></main>内容,而非整页 - Microdata 和 RDFa 可以嵌在语义容器里,但 JSON-LD 不行:它的作用域是整个文档,不是某个 DOM 区域
真正容易被忽略的点是:很多人以为“只要 script 标签存在就行”,却没意识到 Google 的解析器根本不管它物理上在哪层 DOM 树里,只认它是否在初始 HTML 字节流的前 150KB 范围内出现——超了,或者被注释/条件编译包裹,就等于不存在。
- 常见翻车场景:











