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

使用requests.get()请求URL时出现内容解码错误的问题排查

解决requests.get()的gzip解码错误(网页字数统计程序)

问题描述

我正在开发一个从.csv文件读取URL并统计网页字数的程序。URL来自pandas DataFrame中"Article"列的各行,将其传入requests.get(url)时触发了解码错误。

相关代码

读取CSV并调用统计函数的代码

def file_input(file):
   # 读取用户传入的.csv文件
   df = pd.read_csv(file, sep='[;,]', engine='python')
   for i in range(len(df)):
     df.at[i, "Word Count"] = word_counter(df.at[i, "Article"])

字数统计函数

def word_counter(url):
  # 统计网页字数
  count = 0
  # 通过URL获取网页内容
  page = requests.get(url)

报错信息(翻译后)

回溯(最近的调用最后):
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/urllib3/response.py", 第406行, 在 _decode中
    data = self._decoder.decompress(data)
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/urllib3/response.py", 第93行, 在 decompress中
    ret += self._obj.decompress(data)
zlib.error: 解压缩数据时出错 -3: 不正确的头部校验

在处理上述异常期间,发生了另一个异常:

回溯(最近的调用最后):
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/models.py", 第816行, 在 generate中
    yield from self.raw.stream(chunk_size, decode_content=True)
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/urllib3/response.py", 第627行, 在 stream中
    data = self.read(amt=amt, decode_content=decode_content)
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/urllib3/response.py", 第599行, 在 read中
    data = self._decode(data, decode_content, flush_decoder)
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/urllib3/response.py", 第409行, 在 _decode中
    raise DecodeError(
urllib3.exceptions.DecodeError: ('收到带有content-encoding: gzip的响应,但解码失败。', error('解压缩数据时出错 -3: 不正确的头部校验'))

在处理上述异常期间,发生了另一个异常:

回溯(最近的调用最后):
  文件 "main.py", 第59行, 在 <module>中
    main()
  文件 "main.py", 第44行, 在 main中
    file_input(file)
  文件 "main.py", 第35行, 在 file_input中
    df.at[i, "Word Count"] = word_counter(df.at[i, "Article"])
  文件 "main.py", 第13行, 在 word_counter中
    page = requests.get(anything)
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/api.py", 第73行, 在 get中
    return request("get", url, params=params, **kwargs)
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/api.py", 第59行, 在 request中
    return session.request(method=method, url=url, **kwargs)
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/sessions.py", 第587行, 在 request中
    resp = self.send(prep, **send_kwargs)
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/sessions.py", 第745行, 在 send中
    r.content
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/models.py", 第899行, 在 content中
    self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b""
  文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/models.py", 第820行, 在 generate中
    raise ContentDecodingError(e)
requests.exceptions.ContentDecodingError: ('收到带有content-encoding: gzip的响应,但解码失败。', error('解压缩数据时出错 -3: 不正确的头部校验'))

解决方案

1. 禁用gzip自动解码

服务器返回的gzip内容可能存在格式问题,或者请求头的编码协商导致冲突。直接在请求中指定不接受gzip编码:

def word_counter(url):
    count = 0
    # 设置请求头,禁用gzip压缩
    headers = {"Accept-Encoding": "identity"}
    page = requests.get(url, headers=headers)
    # 解析网页文本并统计字数(示例使用BeautifulSoup提取纯文本)
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(page.text, "html.parser")
    raw_text = soup.get_text(strip=True)
    # 按空格分割统计字数,可根据需求调整规则
    count = len(raw_text.split())
    return count

2. 校验URL有效性

确保DataFrame中的URL格式正确,避免传入无效地址导致异常:

import validators

def file_input(file):
    df = pd.read_csv(file, sep='[;,]', engine='python')
    for i in range(len(df)):
        url = df.at[i, "Article"]
        # 校验URL格式
        if validators.url(url):
            df.at[i, "Word Count"] = word_counter(url)
        else:
            df.at[i, "Word Count"] = "无效URL"

3. 更新依赖库版本

旧版本的requests或urllib3可能存在解码bug,执行以下命令更新:

pip install --upgrade requests urllib3

内容的提问来源于stack exchange,提问作者Developer35

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:01:02