有些页面状态码正常,抓取日志也没报警,但蜘蛛拿到的正文却是一串乱码,或者只剩页头和页脚。问题往往不在内容本身,而在编码声明和 HTML 结构这两件“底子”上。
一、编码声明:三处要对得上
页面的字符编码通常会在三个地方出现,任何一处不一致,解析都可能出问题。
- HTTP 响应头里的 Content-Type charset;
- HTML 中 head 里的 meta charset;
- 文件本身、模板文件与数据库连接使用的实际编码。
建议统一成 UTF-8,并把 meta 声明放在 head 靠前的位置。常见的中文乱码是“æ–‡ç« ”这类字符组合,或者整段变成问号。这类页面在浏览器里可能因为自动猜测而看着正常,但蜘蛛读到的文本已经不可用。
二、标签闭合与嵌套:正文容易在这里被吞掉
模板改动、富文本粘贴、编辑器自动补全,都可能留下不完整的标签。以下几类最影响正文解析:
- 未闭合的 div 或 section,后面的内容被算进上一块区域;
- 段落里嵌套块级元素,部分解析器会提前结束段落,把后半段甩到外面;
- 注释没有正确结束,结果一大段正文被当成注释忽略;
- 表格缺少闭合标签,列表和正文被卷进表格结构里。
自查时可以先看“查看源代码”,而不是看渲染后的结果;再用校验工具跑一遍,重点看报错位置附近是不是正好落在正文区域。
三、看不见的字符:零宽字符与全角空格
从文档、后台富文本、表格软件里复制内容时,常会带进零宽空格、零宽连字符、不间断空格等不可见字符。它们不影响肉眼阅读,却会让标题、锚文本出现看似相同的重复条目,也可能打断一段话的连续性。
- 标题或锚文本末尾出现无法解释的空格;
- 同一句话在两个页面里看起来一样,实际字符并不相同;
- 分页、参数拼接时多出莫名其妙的符号。
处理办法是在发布前统一过滤,或在模板输出时做一次清洗,不要把不可见字符带进最终 HTML。
四、一套可执行的自查流程
- 用命令行请求页面,确认响应头里的 charset 与状态码;
- 用“查看源代码”确认正文是否真的写在 HTML 里,而不是由脚本注入;
- 把源码里的中文复制出来,确认没有乱码;
- 跑一次 HTML 校验,记录报错位置;
- 抽查三到五个不同模板的页面:首页、栏目页、详情页、搜索结果页。
五、修正之后的回归检查
编码和结构问题通常是模板级的,改一处会影响全站。上线后建议再做几件事:
- 抽查各模板的正文是否完整,正文里的内链是否还在;
- 确认修改没有引入新的未闭合标签;
- 观察一段时间内的抓取日志,看返回内容长度和抓取状态是否趋于稳定。
编码与结构属于基础项。修好它不会立刻带来排名变化,但能让已经抓到的页面被正确理解。也不要把“解析正常”直接当成“一定会被收录”。