面包屑写给人和写给机器的是两条路,只有16%对得上

面包屑写给人和写给机器的是两条路,只有16%对得上
张文保 24 分钟阅读 1,374 阅读
本文目录
  1. 三份地图是怎么量出来的?
  2. 那两把尺子,为什么一开始是歪的?
  3. 面包屑到底描述了几层?
  4. 为什么商品页的面包屑没比类目页更深?
  5. 网址说的层级,跟面包屑对得上吗?
  6. 人看到的那条路,和机器读到的是同一条吗?
  7. 面包屑上那一格,点过去真能打开吗?
  8. 格式全对,内容全错,这是怎么回事?
  9. 按板块给站点排名,为什么让这件事变要紧了?
  10. 面包屑该怎么写,才算把层级说清楚了?
  11. 把两格式面包屑接上中间层
  12. 让面包屑跟着页面类型变
  13. 把DOM那条和JSON-LD那条对齐
  14. 验一遍链接
  15. 别把面包屑那条槽拿去放别的东西
  16. 这套查法还能用在哪儿?
  17. 常见问题解答
  18. 面包屑只有“首页+当前页”两格,Google会当它无效吗
  19. 结构化数据里的面包屑和页面上看到的不一致,会被判作弊吗
  20. 网址是扁平的,面包屑写深层级,会不会显得矛盾
  21. 面包屑最后一格要不要带链接
  22. 把面包屑用CSS藏起来,只留给机器读,有问题吗
  23. 一件商品挂在多个类目下,面包屑该走哪一条
  24. 这轮的数据能代表全网吗
  25. 权威参考资料

摘要:131个海外品牌站抓了三种页面,68个内页写了面包屑结构化数据。格式几乎没人写错——层级编号从1连到n的占98.7%,空名称一个都没有。可这条路本身对不上:面包屑说的层数、网址的目录层数、页面上那排字的格数,三样都能读到的产品页有25个,三者一致的只有4个。66.2%的面包屑只有一两格,其中47.1%是“首页+当前页”,中间一层都不写。名字对不上的占23.3%,有个站面包屑第一格写的是当天的促销语。

8月28日Google更新了站点声誉滥用的处理办法。在欧洲经济区,原先那种整站级的人工处罚被换掉了,改成把受影响的板块单独拎出来评估、单独排名。Search Engine Journal的报道里有一句话值得琢磨:同一个域名下的不同区域,从此可能拿到不同的待遇。

这听上去是条政策新闻,落到技术层面却是另一个问题:机器凭什么知道某一页属于哪个板块?

一个页面手里有三份答案。网址的目录结构是一份,页面上那排“首页 › 女装 › 上衣”是一份,藏在HTML里的那段BreadcrumbList又是一份。三份都摆在同一个页面上,按理说该说同一件事。

先看个真实的。outdoorvoices.com有个商品叫Desert Shirt,页面上那排面包屑是四格:

Home / Women / Women's Tops & Tanks / Desert Shirt

同一个页面的HTML里,写给机器读的那段结构化数据只有两格:

Home > Desert Shirt

中间的Women和Women's Tops & Tanks,机器完全不知道它们存在。人被告知走了四层,机器被告知只走了两层,而丢掉的恰恰是能说明“这是女装上衣”的那两层。

这不是孤例。保哥把131个站抓了一遍,想弄清楚这三份地图到底有多少能对得上。

三份地图是怎么量出来的?

样本沿用这一系列一直在跑的131个海外品牌与电商独立站,服饰、家居、户外、3C、美妆、食品饮料都有,绝大多数是有独立品牌的中大型站。

每个站用真实浏览器走三步:打开首页,从首页的链接里挑一个类目页和一个商品页,各抓一遍。每一页都存两份HTML——服务端直接吐出来的那份,和JavaScript跑完之后的那份。131个站里124个走通,78个拿到了类目页,77个拿到了商品页,三种页面齐全的68个。

每一页量三样东西:

  • 机器读到的层级:把页面里所有JSON-LD块解析出来,递归找BreadcrumbList,取itemListElement最长的那一份,记下每一格的名字、链接和序号。
  • 网址说的层级:路径按斜杠切段,去掉尾部空段。
  • 人看到的层级:渲染完之后从DOM里找面包屑容器,记下里面的链接文本、条目数,以及它当时是不是真的可见。

这里有两把尺子当场就出了问题,得先说清楚,不然后面的数字都是虚的。

那两把尺子,为什么一开始是歪的?

第一把是网址段数。155个内页样本里,29个(18.7%)的网址开头挂着语言或地区前缀——aloyoga的/en-sg/products/…、byredo的/eu_en/p/…、cybex的/en/cn/p/…,最多的一个占掉了两段。这些段跟商品在站里的位置没有半毛钱关系,纯粹是多国站的路由约定。不减掉,网址就会平白虚胖一到两层,所有“网址比面包屑深”的结论都会跟着虚高。

第二把是DOM面包屑选择器。用nav[aria-label*=breadcrumb][class*=breadcrumb]去捞,多数站捞得挺准,但innisfree那一条捞回来37个链接,整条站点导航连同底部的服务条款一起被卷进来了。这一条必须剔除。

这两件事其实是同一件事的两面:凡是新造的判据,跑完先抽样人工看一遍。这轮我逐条核对了70组页面地址和10组可疑的DOM面包屑,抓出这两处,代价是半小时;要是没核对直接写结论,代价就是整篇文章。这个教训在上一轮用网址判断页面类型的实测里刚栽过一次,70组挑错4组,这次算是有备而来。

面包屑到底描述了几层?

抓到的类目页和商品页里,一共68个页面写了面包屑结构化数据(34个类目页、34个商品页,跟上面那个“三种页面齐全的68个站”是两码事,数字撞了纯属巧合)。层数分布是这样的:

层数页面数占比
1层34.4%
2层4261.8%
3层1623.5%
4层57.4%
5层11.5%
7层11.5%

一两格的合计45个,占66.2%。其中32个(占全部内页面包屑的47.1%)是标准的“首页+当前页”两格式——第一格链到首页,第二格就是这一页自己,中间一层不写。

面包屑这个东西存在的理由就是描述层级。一条只有起点和终点的路径,描述的层级恰好是零。它在页面上还能起点导航作用,人点一下能回首页;可对着机器,它说的是“这个站只有两层,首页下面直接就是商品”。

只有一格的那三个更极端。aboutyou的类目页面包屑就一个词Women,beistravel的商品页就一个商品名,两者都没有链接把它接到任何地方。schema.org对BreadcrumbList的定义是“一条通向当前页的路径”,一格的路径在语义上不成立,但格式校验不会报错,所以它就一直在那儿。

为什么商品页的面包屑没比类目页更深?

正常的站点结构里,商品页应该比类目页深一层:类目页是“首页 › 女装 › 上衣”,商品页是“首页 › 女装 › 上衣 › 这件衣服”。

27个站两种页面都写了面包屑,实际情况是:

对比站数占比
商品页比类目页深1037.0%
两者一样深1555.6%
商品页反而更浅27.4%

超过一半的站,面包屑没跟着页面类型变。而且这15个里有13个是“类目页2层、商品页2层”——两边都是“首页+当前页”,一个模子刻出来的。

这说明了一件挺关键的事:这些面包屑不是从站点结构里算出来的,是模板里写死的。类目页的模板写一句“首页加当前类目名”,商品页的模板写一句“首页加当前商品名”,两句各管各的,谁也没去问上一层是谁。站点架构本身可能做得很清楚,但那份清楚没有被翻译成机器能读的东西。

比较有意思的是反过来的那两个。商品页面包屑比类目页还浅,只有一种解释:商品页的模板比类目页的更省事。

网址说的层级,跟面包屑对得上吗?

减掉语言前缀之后,把面包屑层数和网址有效段数放一起:

页面类型样本两者相等面包屑更深网址更深
类目页3424(70.6%)4(11.8%)6(17.6%)
商品页3416(47.1%)13(38.2%)5(14.7%)

类目页七成能对上,商品页掉到不到一半。页面越深,两份地图分歧越大。

方向也变了。类目页对不上的时候,更常见的是网址更深;商品页对不上的时候,压倒性地是面包屑更深。原因不难猜:绝大多数电商平台的商品网址是扁平的,/products/商品名两段到底,跟商品挂在哪个类目下毫无关系。这件事本身没错,扁平网址在电商站里是主流选择,一件商品挂三个类目的时候,深层网址反而会制造重复。

问题在于,扁平网址等于主动放弃了用路径表达层级。那层级信息只剩面包屑一个出口。而我们刚看到,六成六的面包屑只有一两格。两个出口,一个主动关了,另一个开了条缝。

差距最大的是aboutyou的商品页:面包屑7层,网址3段(其中还有一段是商品ID)。它的面包屑是全样本里写得最认真的一条,Women › Sportswear › Sports › Outdoor › Shoes › MERRELL Shoes › Flats 'MOAB SPEED 2',一层不落。这也是唯一一个把类目层级完整还原出来的站。反过来说,用目录层级把结构写进网址的站,面包屑写浅一点还有救;扁平网址加浅面包屑,就是两头都没有。

人看到的那条路,和机器读到的是同一条吗?

这是三份地图里最难对的一组。43个页面两层都能读到,比对每一格的文字:

名字基本一致的33个(76.7%),对不上的10个(23.3%)。

对不上的那10个,形态五花八门:

站点机器读到的人看到的
outdoorvoicesHome › Desert ShirtHome › Women › Women's Tops & Tanks
casperHome › The One(空)› Mattresses › The Foams
monosHome › Compressible Packing CubesJust in time for fall travel
hellotushyHome › TUSHY Classic 4.0Homepage › Shop
flyingtigerProducts › All › Tablecloth with pumpkin printHomepage › Pumpkins
peakdesignProducts › Gift CardHome

casper那条最值得看:机器读到的终点叫The One,人看到的终点叫The Foams。两条路径连终点是哪件商品都没谈拢。

monos那条则有点黑色幽默。它的面包屑容器规规矩矩标着aria-label="breadcrumb",里面装的是一句“Just in time for fall travel”——赶秋季旅行正是时候。那个位置在版面上离页头很近,视觉上又是一条窄条,于是被拿去挂了当季促销语。无障碍工具读到这里会告诉用户“你现在的位置是:赶秋季旅行正是时候”。

还有7个站更直接,面包屑写好了,然后用CSS藏起来。beistravel、everlane、govee、mackweldon、nativecos、on.com、warbyparker,容器都在DOM里,计算样式是不可见。这些页面上,人根本看不到面包屑,能看到的只有机器。这跟首页那三行自我介绍各说各话是同一类毛病:同一件事在页面上有多个出口,改了一个忘了另一个。

面包屑上那一格,点过去真能打开吗?

这是最容易被跳过的一步。面包屑里91.1%的格子带了链接,可没人验过这些链接通不通。

134个格子逐个请求,结果得分两批说。第一批用普通HTTP客户端跑,得到91个200、15个403、23个429、4个404、1个418。看上去很吓人,但403和429基本都是反爬机制在拦我,不是链接坏了。换成带完整浏览器指纹的Chromium再跑一遍那39个,21个变成了200。

清算下来:

  • 确认能打开:112个,83.6%
  • 真的404:4个,占可判定样本的3.4%
  • 连真实浏览器都被挡在门外:18个,13.4%

3.4%的死链率不算高,但那4个的成因值得单独讲。

peakdesign占了两个,而且是同一个根因。它的面包屑第一格写的是www.peakdesign.com/collections——少了https://。少这七个字符,机器就不把它当绝对地址,而是当相对路径,接在当前目录后面,拼出来是/global/collections/www.peakdesign.com/collections一个格子少写了协议头,把机器送到了一个不存在的地址。浏览器里点着没事,因为人从来不点面包屑的第一格。

剩下两个,byredo的Eyes那一格指向一个已经下线的三级类目,chubbies的Products那一格指向一个从来就不存在的路径。全样本里还有9个格子写的是相对路径、3个格子跨到了别的域名。

那18个连浏览器都进不去的更微妙。madewell的四格、warbyparker的三格,返回的是403,不是链接坏,是门口有人拦着。面包屑上写着的路,机器不一定走得通——不是路断了,是没让它进。要判断这类问题,得回到服务器日志里看真实爬虫拿到的是什么状态码,光在浏览器里点是看不出来的。

格式全对,内容全错,这是怎么回事?

把上面这些放一起,会看到一个挺反常的对比。

格式层几乎是满分:

  • position序号从1连到n的:77个,98.7%
  • 名称字段为空的:0个
  • 同一条面包屑里出现重名层级的:0个
  • JSON解析失败的:0个

内容层是这样:

  • 三份地图层数完全一致的商品页:25个里4个,16.0%
  • 类目页:18个里4个,22.2%
  • 名字对不上的:23.3%
  • 只有一两层的:66.2%

这两组数字的落差,指向同一个机制:格式是工具管的,内容是人管的,而这件事上没有人管。

说得刻薄一点,这有点像考试的时候把姓名、日期、准考证号一笔一画填得工工整整,然后答题卡整版涂了A。机器扫过去,格式一处不错。

position连不连续,JSON能不能解析,字段有没有拼错——这些校验器都会报错,插件也都替你处理好了。而“第二格应该写Women还是写商品名”,没有任何工具能判断,也没有任何报告会提醒你。页面不被收录时的那套分诊流程里也查不到这一层,因为它压根不产生错误。JSON-LD的校验工具能抓出一个尾逗号,抓不出一条只有两格的面包屑。结构化数据审计工具能列出你写了哪几种类型,列不出这条路径是不是通往真实位置。

这跟上一轮量到的价格和规格那组数字是同一个道理:有富媒体回报的字段,64个站全写了;没有回报又不报错的字段,只有7个站写。面包屑不巧两头都占——它有富媒体展示,所以大家都写;写成什么样没人验,所以就写成了模板里最省事的那个样子。

按板块给站点排名,为什么让这件事变要紧了?

回到开头那条政策。在那之前先说个容易被忽略的背景:Google在移动搜索结果里已经不再显示面包屑那一行了。展示位没了,不少团队顺手就把这块的维护一并停了——可结构化数据那一份,机器还在读。

过去很长一段时间,搜索引擎对站点的判断基本是整站级的。域名有没有信任度,内容质量高不高,处罚起来一罚一大片。在这个框架下,一个页面属于哪个板块,只是个锦上添花的信息。

现在这个前提松动了。Google的垃圾内容政策里,站点声誉滥用讲的就是“第三方内容借用主站信誉”这件事,处理的对象是站点里的某一部分而不是整站。要把某一部分单独拎出来,得先知道边界在哪。

边界从哪儿来?只有三个来源,就是我们量的这三份:网址路径、面包屑、页面上的导航结构。三份对不上的时候,机器只能挑一份信,或者哪份都不信。

这件事在AI搜索这边更明显。生成式回答要判断一个页面能不能拿来回答某个类目级的问题,判断依据不是页面上有什么词,而是这个页面在站里的位置。一个只写了“首页+商品名”的面包屑,在这套逻辑里等于告诉机器:这件商品不属于任何类目。schema堆得再满,实体之间的关系没写清楚也白搭,说的正是这层。

再往前一步,AI代理要在你的站里替用户完成一次操作的时候,它需要的第一件事就是知道自己站在哪、上一层是什么、能往哪儿退。面包屑本来是这套信息最现成的载体,可它现在多数时候只说了两句话:这是首页,这是当前页。

面包屑该怎么写,才算把层级说清楚了?

动手之前先说个前提:不是每个站都需要深面包屑。如果你的站真的只有两层——首页下面直接摆着二十来件商品,没有中间类目——那两格面包屑说的就是实话,一个字都不用改。这轮样本里有几个单品类小站正是这种情况,它们的两格面包屑是准确的。

要改的是另一种:导航菜单里明明挂着三四级类目,面包屑却只写两格。判断标准简单到不用工具——把鼠标移到主导航上,数一数能展开几级,面包屑就该有几级。

下面按这轮量到的问题,从最该先动的排起。

把两格式面包屑接上中间层

如果你的商品页面包屑长这样:

{"@type":"ListItem","position":1,"name":"Home","item":"https://example.com/"}
{"@type":"ListItem","position":2,"name":"这件商品"}

那它需要变成这样:

{"@type":"ListItem","position":1,"name":"Home","item":"https://example.com/"}
{"@type":"ListItem","position":2,"name":"女装","item":"https://example.com/collections/women"}
{"@type":"ListItem","position":3,"name":"上衣","item":"https://example.com/collections/women-tops"}
{"@type":"ListItem","position":4,"name":"这件商品"}

中间那两层从哪儿来?商品数据里本来就有类目字段,模板里取一下的事。多数平台的商品对象都带着它挂在哪些集合下的信息,只是默认模板没用。Google给商品结构化数据加category字段那次也是同一个方向:把页面标记和后台的分类对上。

让面包屑跟着页面类型变

如果你的类目页和商品页面包屑一样深,那多半是两套模板各写各的。检查方式很简单:找一个三级类目下的商品,看面包屑有没有三格以上。

把DOM那条和JSON-LD那条对齐

Google的面包屑文档说得很直白,结构化数据里的面包屑应该跟页面上可见的那条一致。这一条不只是合规问题——两条不一致的时候,你其实不知道搜索结果里会显示哪一条。

验一遍链接

把所有面包屑item的地址收集起来跑一遍状态码,重点看三类:没写协议头的相对地址、跳转到别的域名的、返回404的。这一步用能批量看状态码的工具跑一遍就行,成本很低,但没人做。

别把面包屑那条槽拿去放别的东西

促销语、公告条、当季主题——它们都不是位置信息。真要放,换个容器,别占着标了breadcrumb的那个。

最后一件,也是最容易忽略的:如果你的网址是扁平的,面包屑就是你唯一的层级出口。扁平网址本身是个合理选择,扁平和层级各有各的适用场景,但选了扁平就得在面包屑上补回来。两边都省,机器手里就一份地图都没有了。

这套查法还能用在哪儿?

面包屑只是个入口。同一套“三份地图对不对得上”的查法,能套到几个地方。

分页是一处。第二页的面包屑跟第一页一样吗,还是加了一格“第2页”?分类页分页本来就有好几种处理方案,选哪一种,面包屑要不要跟着动,答案是不一样的。而面包屑一动,规范网址该指向哪一页也得跟着重新想一遍——Google合并重复网址的那套规则在这里就是判断依据。

筛选后的类目页是另一处。用户点了“红色”“L码”,网址多了两个参数,面包屑动了没有?多数站是不动的,于是筛选后的页面和筛选前的页面在机器看来是同一个位置——这跟分面导航的治理是同一件事的两面。

博客和内容板块也值得一看。Shopify的博客要做多级面包屑得自己动手,平台默认只给一层,于是内容板块常常是全站面包屑最薄的地方。

还有多语言站。同一件商品的英文页和德文页,面包屑的层数一样吗,名字翻译了吗?这轮样本里的多语言站不多,挑了几个翻开看,名字都译过,层级结构保持一致,这是对的做法。不过样本太少,只能算个观察,没做成统计。

自己站上跑一遍的最小成本方案:挑一个三级类目下的商品页,把三样东西并排写下来——网址切段、页面上那排字、结构化数据里的itemListElement。三列对齐了看,对不上的地方一眼就出来。这个动作五分钟,比装任何工具都快。

说到底,面包屑是网站上少有的、同时写给人和机器看的那种东西。它在页面上占一行,在HTML里占十几行,两边说的话本该是同一句。这轮量下来,两边真正对上的不到四分之一——不是因为这件事难,是因为它从来没被当成同一件事来管。

常见问题解答

面包屑只有“首页+当前页”两格,Google会当它无效吗

不会报错,也不会有任何提示。格式合法,富媒体展示照常。它只是没提供任何层级信息——从机器的角度,这跟没写面包屑的区别,只是多了一个通往首页的链接。

结构化数据里的面包屑和页面上看到的不一致,会被判作弊吗

一般不会被当成作弊,但属于Google文档里明确不建议的做法。真实风险是不可控:你没法预期搜索结果里显示的是哪一条。这轮量到23.3%的页面两者对不上,说明这条建议在实际中执行得很松。

网址是扁平的,面包屑写深层级,会不会显得矛盾

不矛盾。网址是资源地址,面包屑是位置声明,本来就是两回事。扁平网址加深层级面包屑是很多大站的标准做法,样本里做得最完整的aboutyou就是这样——网址3段,面包屑7层。

面包屑最后一格要不要带链接

可带可不带。这轮82.1%的样本带了。带的话,指向的应该就是当前页自己;不带的话,用一个只有name的ListItem。两种Google都接受。真正要避免的是指向一个跟当前页无关的地址。

把面包屑用CSS藏起来,只留给机器读,有问题吗

有。这属于给机器和给用户看的内容不一致,本身就落在需要解释的灰区里。更实际的问题是:既然写了,为什么不给用户用?这轮7个这么做的站具体是什么原因,我没法从外部确认。一个常见的场景是改版时把面包屑的显示逻辑关掉了,结构化数据那半还留在模板里,没人回头看。

一件商品挂在多个类目下,面包屑该走哪一条

选一条主路径,并且保持稳定。Google的文档里允许一个页面有多条BreadcrumbList,但实际操作中多条会让位置声明变模糊。更稳的做法是给每件商品定一个主类目,面包屑只走这条,其他类目靠内链和集合页去覆盖。

这轮的数据能代表全网吗

不能。样本是131个有品牌的中大型电商站,本身就是相对规范的一批。全网范围内的面包屑覆盖率和写法质量,只会比这组数字更差,不会更好。

权威参考资料

分享到
标签
版权声明

本文标题:《面包屑写给人和写给机器的是两条路,只有16%对得上》

本文链接:https://zhangwenbao.com/breadcrumb-hierarchy-three-maps-audit.html

版权声明:本文原创,转载与引用请注明作者与原文链接。许可协议: CC BY 4.0

继续阅读
发表评论
分享到微信 或在下方手动填写
支持 Ctrl + Enter 提交