r = requests.get(url) print(r.encoding, r.apparent_encoding) r.encoding = 'utf-8' print(r.text[:50])
response.encoding 取到 gbk,text 里「中」变成三个怪字符,一条 20 字的标题错了 14 个字,手动按 utf-8 解码后完全正常。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:requests 在没有响应头 charset 时会去猜,猜的依据就是 meta 标签,而这份页面转码时 meta 没跟着改。编码错了不抛异常,只会安静地把字节按错误方式拼成字符。
这次卡住的地方就在「页面编码误判」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
处理上按这个顺序:先看 Content-Type 里有没有 charset;没有就对比 apparent_encoding;用 content 手动 decode 指定编码;入库前加一道乱码字符比例校验。
确认没问题再收工,按 utf-8 解码后 200 条标题乱码 0 条,抽 20 条与浏览器显示逐字一致。
