有些頁面狀態碼正常,抓取日誌也没报警,但蜘蛛拿到的正文却是一串乱碼,或者只剩頁头和頁脚。問题往往不在内容本身,而在编碼声明和 HTML 结构這两件“底子”上。
一、编碼声明:三處要對得上
頁面的字符编碼通常會在三個地方出現,任何一處不一致,解析都可能出問题。
- HTTP 响應头里的 Content-Type charset;
- HTML 中 head 里的 meta charset;
- 文件本身、模板文件與資料库连接使用的實际编碼。
建议统一成 UTF-8,並把 meta 声明放在 head 靠前的位置。常见的中文乱碼是“æ–‡ç« ”這類字符组合,或者整段變成問号。這類頁面在浏览器里可能因為自動猜测而看着正常,但蜘蛛讀到的文本已经不可用。
二、标簽閉合與嵌套:正文容易在這里被吞掉
模板改動、富文本粘贴、編輯器自動补全,都可能留下不完整的标簽。以下几類最影响正文解析:
- 未閉合的 div 或 section,後面的内容被算進上一块区域;
- 段落里嵌套块級元素,部分解析器會提前結束段落,把後半段甩到外面;
- 注释没有正确結束,结果一大段正文被当成注释忽略;
- 表格缺少閉合标簽,列表和正文被卷進表格结构里。
自查时可以先看“查看源代碼”,而不是看渲染後的结果;再用校驗工具跑一遍,重点看报错位置附近是不是正好落在正文区域。
三、看不见的字符:零宽字符與全角空格
從文档、後台富文本、表格软件里複製内容时,常會带進零宽空格、零宽连字符、不間断空格等不可见字符。它們不影响肉眼阅讀,却會让标题、锚文本出現看似相同的重复條目,也可能打断一段话的连續性。
- 标题或锚文本末尾出現無法解释的空格;
- 同一句话在两個頁面里看起来一样,實际字符並不相同;
- 分頁、參數拼接时多出莫名其妙的符号。
處理办法是在發布前统一過滤,或在模板輸出时做一次清洗,不要把不可见字符带進最终 HTML。
四、一套可执行的自查流程
- 用命令行請求頁面,確認响應头里的 charset 與狀態碼;
- 用“查看源代碼”確認正文是否真的寫在 HTML 里,而不是由脚本注入;
- 把源碼里的中文複製出来,確認没有乱碼;
- 跑一次 HTML 校驗,记錄报错位置;
- 抽查三到五個不同模板的頁面:首頁、栏目頁、詳情頁、搜尋结果頁。
五、修正之後的回归检查
编碼和结构問题通常是模板級的,改一處會影响全站。上线後建议再做几件事:
- 抽查各模板的正文是否完整,正文里的内鏈是否還在;
- 確認修改没有引入新的未閉合标簽;
- 观察一段時間内的抓取日誌,看返回内容長度和抓取狀態是否趋于稳定。
编碼與结构属于基础項。修好它不會立刻带来排名變化,但能让已经抓到的頁面被正确理解。也不要把“解析正常”直接当成“一定會被收錄”。