现场是这样的。编辑从 Word 粘贴标题,带进了不换行空格,页面上看不出差别。搜索结果标题前面空出一大块,必应还把整条标题当成两个不相关的片段,排名跟着掉。
中间走过弯路,把「sitemap 里的 title 与页面不一致,多了一个实体」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。nbsp 被当成可见字符参与分词,产生空词;标题在数据库里前后带空格,模板没有 trim;摘要复制标题时把实体一起带出来。
上来先检查标题里的不可见字符
python -c "t=open('t.txt').read();print([hex(ord(c)) for c in t if ord(c)>127][:10])"
批量找出带 nbsp 的标题
mysql -e "SELECT ID FROM posts WHERE post_title LIKE '% %';" -N
随后清理首尾空白和实体
mysql -e "UPDATE posts SET post_title=TRIM(REPLACE(post_title,' ',' ')) WHERE post_title LIKE '% %';"
末了抽查修改后的页面输出
curl -s https://www.example.com/p/1 | grep -o '<title>[^<]*</title>'
怎么算真的好了,看的是同一批现象。标题里不再有不可见字符,搜索结果开头对齐,标题被拆成两段的情况消失。
容易忽略的是,从 Word 或微信复制的内容常带隐藏字符,入库前统一清洗一次省很多事。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
