这个坑值得记一笔。站点有大量带参数的筛选页,sitemap 生成时把 & 原样写了进去。XML 解析在第一个 & 处报「EntityRef: expecting ';'」,蜘蛛只读到前 120 条,后面八千条一条没发现。
刚开始盯着「提交时报告显示「无法读取网站地图」,看板里却只显示待处理」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。生成器直接字符串拼接 URL,没有做 XML 实体转义;内容里的 & 与 < 同样没有转义,报错位置落在标题字段;生成器把标题里的 & 原样写进 loc 标签 转义顺序放错了位置。
动手时先验证 XML 能不能解析
python -c "import xml.etree.ElementTree as E;E.parse('sitemap.xml')"
然后把地址与字段统一转义
import html; url = html.escape(url, quote=True)
生成后用校验工具跑一遍
xmllint --noout sitemap.xml && echo OK
末了重新提交并看发现的 URL 数量
curl -s https://www.example.com/sitemap.xml | grep -c '<loc>'
当时还开着另一个排查窗口,两边日志对照着看才定位到。
同一份数据我导出了两份,一份留底,一份拿来试。
怎么算真的好了,看的是同一批现象。转义后 xmllint 不再报错,GSC 里 sitemap 状态从无法读取变成成功,发现的 URL 从 120 条涨到 8300 条。
转义时注意 & 只转一次,转两遍会变成 &,蜘蛛读出的地址直接带错参数。这类问题最好一次改到位,反复小改反而容易把原因搅混。
