使用requests请求网页交替返回正常内容与乱码,重编码无效如何解决
问题原因
- 最常见诱因是服务器交替返回压缩/非压缩响应,但部分压缩响应漏传了
Content-Encoding头:requests默认仅会对携带该标识的响应自动解压,没有标识时会直接把压缩二进制流当做普通文本解码,最终生成乱码。该场景下手动调整编码完全无效,因为原始内容还未完成解压。 - 自定义请求头的
Accept-Encoding字段配置异常:requests默认会自动处理压缩协商逻辑,如果你手动在headers中添加了该字段,可能出现协商不匹配,导致压缩内容无法被正常识别。 - 代理节点异常:如果请求使用了代理服务,部分代理节点会自动压缩响应但没有补充对应的
Content-Encoding头,也会触发该问题。
解决方案
步骤1:移除自定义的Accept-Encoding配置
优先检查你定义的headers变量中是否包含Accept-Encoding字段,如果有直接删除即可,requests会自动处理压缩协商和自动解压逻辑,不需要手动配置该参数。
步骤2:手动兼容无标识的压缩响应
如果移除配置后问题仍存在,说明服务器确实存在漏传响应头的问题,可增加手动解压逻辑:
import requests import gzip from io import BytesIO r = requests.get(url, headers=headers, params=params) raw_content = r.content # 尝试gzip解压 try: unzip_content = gzip.GzipFile(fileobj=BytesIO(raw_content)).read() raw_content = unzip_content except: # 解压失败说明是未压缩内容,跳过处理 pass # 手动指定网页实际编码,可根据站点调整为gbk、gb2312等 print(raw_content.decode("utf-8", errors="replace"))
步骤3:修复编码识别错误
如果确认内容未压缩,只是编码识别错误,可在读取r.text前手动指定编码:
r = requests.get(url, headers=headers, params=params) # 替换为站点实际使用的编码 r.encoding = "utf-8" print(r.text)
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

