Requests报”requests.exceptions.ContentDecodingError: Failed to decode response content: {error message} “的原因以及解决办法

  • Post category:Python

该异常是由于响应内容的编码格式无法被Requests模块识别导致的。通常情况下,该异常的原因可能是以下几种情况:

  1. 服务器返回的响应内容编码格式与Requests模块默认编码格式不一致;
  2. 服务器返回的响应内容被压缩,无法被Requests模块正确解压;
  3. 服务器返回的响应内容包含非法字符或非文本格式的二进制字符等无法被解码的内容。

下面分别介绍可能的原因及对应的解决方案。

情况一:服务器返回的响应内容编码格式与Requests模块默认编码格式不一致。

解决办法:可以在发送请求的headers中设置Accept-Encoding为”*”,让服务器返回未经压缩的内容,或者在headers中设置对应的编码格式,如下所示:

import requests

url = "http://example.com"
headers = {'Accept-Encoding': 'gzip, deflate',
           'Accept-Language': 'en-US,en;q=0.9,zh;q=0.8,zh-CN;q=0.7'}
response = requests.get(url, headers=headers)

情况二:服务器返回的响应内容被压缩,无法被Requests模块正确解压。

解决办法:可以使用Python标准库中的gzip模块和io模块进行解压,参考代码如下:

import requests
import gzip
import io

url = "http://example.com"
headers = {'Accept-Encoding': 'gzip, deflate',
           'Accept-Language': 'en-US,en;q=0.9,zh;q=0.8,zh-CN;q=0.7'}
response = requests.get(url, headers=headers)

if response.headers.get('content-encoding') == 'gzip':
    content = gzip.decompress(response.content)
else:
    content = response.content
print(content.decode('UTF-8'))

情况三:服务器返回的响应内容包含非法字符或非文本格式的二进制字符等无法被解码的内容。

解决办法:可以在发送请求的headers中设置Content-Type为二进制格式,然后使用BytesIO进行解码,参考代码如下:

import requests
from io import BytesIO

url = "http://example.com"
headers = {'Content-Type': 'application/octet-stream'}
response = requests.get(url, headers=headers)

content = BytesIO(response.content)
print(content.read())

以上是一些可能的原因及对应的解决方案,需要根据具体情况进行选择和调整。