先看现象。商品 sitemap 里有带筛选参数的地址,脚本直接拼了 & 没有转义成 &。整份文件在 GSC 里显示成功,但带参数的 8000 条一条没被抓取。
排查方向其实有限,先把可能性排一排。XML 里 & 必须转义,否则整条记录被判格式错误。也可能是生成脚本用字符串拼接,没有走 XML 库的转义。
少数情况下是解析器遇到错误后跳过整段 url 节点,不报行号。
不容易想到的是,CDN 的 HTML 压缩又把 & 还原成了 &,二次破坏。
定位未转义的字符
grep -n '&[^a]' sitemap.xml | head
接着改用 XML 库生成而不是拼字符串
python -c "from lxml import etree;print(etree.tostring(etree.Element('loc')))"
再往下对 sitemap 关闭 HTML 改写与压缩
curl -sI https://www.example.com/sitemap.xml | grep -i content-encoding
复验解析出的条数与预期一致
xmllint --xpath 'count(//url)' sitemap.xml
怎么算真的好了,看的是同一批现象。sitemap 能正常解析出全部 2.3 万条,带参数的 8000 条在两周内被抓取了六成,GSC 的已发现数同步上涨。
提醒一点。只要地址里出现 &,就必须走 XML 序列化,手工拼接在本地看没问题,到了解析器那边整段都会丢。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
