Python爬虫乱码问题如何解决?设置response.encoding为utf-8或让apparent_encoding自动识别?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1004个文字,预计阅读时间需要5分钟。
由于很多网页实际的编码不是UTF-8,硬编码requests自动识别的结果会导致乱码。例如GBK编码的中文字符页面,强制设置utf-8后,response.text解码时会把两个字节当作一个UTF-8字符处理,直接导致崩溃或乱码。
requests 默认用 response.apparent_encoding(基于 chardet 探测)做初始解码,这个值通常比硬写 utf-8 更靠谱——但也不是万能的,尤其遇到 meta 标签缺失、BOM 混乱或压缩传输时。
- 优先看
response.headers.get('content-type'),如果有charset=gbk这类明确声明,就按它来 - 没声明时,先打印
response.apparent_encoding和response.content[:100](二进制前100字节),确认探测是否合理 - 若探测结果是
utf-8但页面明显乱码,大概率是 GBK/GB2312,可试response.content.decode('gbk', errors='ignore')
apparent_encoding 为啥经常不准,怎么补救
chardet 的探测逻辑依赖字节分布统计,对短文本、无特征内容(比如纯数字 ID 列表)、含大量英文的中文页,容易误判为 ascii 或 utf-8。
本文共计1004个文字,预计阅读时间需要5分钟。
由于很多网页实际的编码不是UTF-8,硬编码requests自动识别的结果会导致乱码。例如GBK编码的中文字符页面,强制设置utf-8后,response.text解码时会把两个字节当作一个UTF-8字符处理,直接导致崩溃或乱码。
requests 默认用 response.apparent_encoding(基于 chardet 探测)做初始解码,这个值通常比硬写 utf-8 更靠谱——但也不是万能的,尤其遇到 meta 标签缺失、BOM 混乱或压缩传输时。
- 优先看
response.headers.get('content-type'),如果有charset=gbk这类明确声明,就按它来 - 没声明时,先打印
response.apparent_encoding和response.content[:100](二进制前100字节),确认探测是否合理 - 若探测结果是
utf-8但页面明显乱码,大概率是 GBK/GB2312,可试response.content.decode('gbk', errors='ignore')
apparent_encoding 为啥经常不准,怎么补救
chardet 的探测逻辑依赖字节分布统计,对短文本、无特征内容(比如纯数字 ID 列表)、含大量英文的中文页,容易误判为 ascii 或 utf-8。

