文章页用 JSON-LD 标了 FAQPage,富媒体测试报 mainEntity 类型不符,可页面上确实有六组问答,代码是从旧模板里直接拷过来的。

一开始怀疑是「六组问答写成了六个独立的 script 标签,被当成重复实体」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。mainEntity 的每一项被包成了数组,值应该是 Question 对象。也可能是acceptedAnswer 里又套了一层数组,层级多了一级。

不容易想到的是,text 字段里放的是富文本 HTML,标签没有被清理。

动手时先把页面里的 JSON-LD 抽出来看结构

curl -s https://www.example.com/a/1.html | grep -o '<script type="application/ld+json">.*</script>' | head -c 800

随后用测试工具核对报错字段的路径

curl -s https://www.example.com/a/1.html | python -c "import sys,json,re;d=re.search(r'ld\+json\">(.*?)</script>',sys.stdin.read(),re.S);print(json.loads(d.group(1))['mainEntity'][0])"

接着把问答改成标准对象结构

{"@type":"Question","name":"问题","acceptedAnswer":{"@type":"Answer","text":"回答"}}

剩下的就是合并成一个 mainEntity 数组

"mainEntity":[{"@type":"Question"},{"@type":"Question"}]

别只看报错消失,验证要多做一步。测试工具不再报类型错误,富媒体预览里能看到全部六组问答。

补一句。mainEntity 是数组,数组里的每一项必须是 Question 对象,多包一层数组是最常见的写法错误。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189