面包屑写给人和写给机器的是两条路,只有16%对得上
本文目录
- 三份地图是怎么量出来的?
- 那两把尺子,为什么一开始是歪的?
- 面包屑到底描述了几层?
- 为什么商品页的面包屑没比类目页更深?
- 网址说的层级,跟面包屑对得上吗?
- 人看到的那条路,和机器读到的是同一条吗?
- 面包屑上那一格,点过去真能打开吗?
- 格式全对,内容全错,这是怎么回事?
- 按板块给站点排名,为什么让这件事变要紧了?
- 面包屑该怎么写,才算把层级说清楚了?
- 把两格式面包屑接上中间层
- 让面包屑跟着页面类型变
- 把DOM那条和JSON-LD那条对齐
- 验一遍链接
- 别把面包屑那条槽拿去放别的东西
- 这套查法还能用在哪儿?
- 常见问题解答
- 面包屑只有“首页+当前页”两格,Google会当它无效吗
- 结构化数据里的面包屑和页面上看到的不一致,会被判作弊吗
- 网址是扁平的,面包屑写深层级,会不会显得矛盾
- 面包屑最后一格要不要带链接
- 把面包屑用CSS藏起来,只留给机器读,有问题吗
- 一件商品挂在多个类目下,面包屑该走哪一条
- 这轮的数据能代表全网吗
- 权威参考资料
摘要: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层 | 3 | 4.4% |
| 2层 | 42 | 61.8% |
| 3层 | 16 | 23.5% |
| 4层 | 5 | 7.4% |
| 5层 | 1 | 1.5% |
| 7层 | 1 | 1.5% |
一两格的合计45个,占66.2%。其中32个(占全部内页面包屑的47.1%)是标准的“首页+当前页”两格式——第一格链到首页,第二格就是这一页自己,中间一层不写。
面包屑这个东西存在的理由就是描述层级。一条只有起点和终点的路径,描述的层级恰好是零。它在页面上还能起点导航作用,人点一下能回首页;可对着机器,它说的是“这个站只有两层,首页下面直接就是商品”。
只有一格的那三个更极端。aboutyou的类目页面包屑就一个词Women,beistravel的商品页就一个商品名,两者都没有链接把它接到任何地方。schema.org对BreadcrumbList的定义是“一条通向当前页的路径”,一格的路径在语义上不成立,但格式校验不会报错,所以它就一直在那儿。
为什么商品页的面包屑没比类目页更深?
正常的站点结构里,商品页应该比类目页深一层:类目页是“首页 › 女装 › 上衣”,商品页是“首页 › 女装 › 上衣 › 这件衣服”。
27个站两种页面都写了面包屑,实际情况是:
| 对比 | 站数 | 占比 |
|---|---|---|
| 商品页比类目页深 | 10 | 37.0% |
| 两者一样深 | 15 | 55.6% |
| 商品页反而更浅 | 2 | 7.4% |
超过一半的站,面包屑没跟着页面类型变。而且这15个里有13个是“类目页2层、商品页2层”——两边都是“首页+当前页”,一个模子刻出来的。
这说明了一件挺关键的事:这些面包屑不是从站点结构里算出来的,是模板里写死的。类目页的模板写一句“首页加当前类目名”,商品页的模板写一句“首页加当前商品名”,两句各管各的,谁也没去问上一层是谁。站点架构本身可能做得很清楚,但那份清楚没有被翻译成机器能读的东西。
比较有意思的是反过来的那两个。商品页面包屑比类目页还浅,只有一种解释:商品页的模板比类目页的更省事。
网址说的层级,跟面包屑对得上吗?
减掉语言前缀之后,把面包屑层数和网址有效段数放一起:
| 页面类型 | 样本 | 两者相等 | 面包屑更深 | 网址更深 |
|---|---|---|---|---|
| 类目页 | 34 | 24(70.6%) | 4(11.8%) | 6(17.6%) |
| 商品页 | 34 | 16(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个,形态五花八门:
| 站点 | 机器读到的 | 人看到的 |
|---|---|---|
| outdoorvoices | Home › Desert Shirt | Home › Women › Women's Tops & Tanks |
| casper | Home › The One | (空)› Mattresses › The Foams |
| monos | Home › Compressible Packing Cubes | Just in time for fall travel |
| hellotushy | Home › TUSHY Classic 4.0 | Homepage › Shop |
| flyingtiger | Products › All › Tablecloth with pumpkin print | Homepage › Pumpkins |
| peakdesign | Products › Gift Card | Home |
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
← 上一篇
过时HTML标签实测:换个平台只是换一批老代码下一篇 →
没有了