You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 01:00:02