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

使用Urlretrieve下载TXT文件时常出现乱码,求解决方案

解决Urlretrieve下载TXT文件乱码的问题

我之前也碰到过类似的情况,你遇到的乱码问题大概率是两个原因叠加导致的:服务器返回gzip压缩内容但未自动解压缩,以及文本编码不匹配。结合你说“偶尔正常多数乱码”,前者是主要诱因——目标站点会根据请求头动态返回压缩内容,urlretrieve默认不会处理压缩,直接把二进制压缩数据存成TXT,自然显示乱码。

下面是经过验证的修复方案,替换你原来的代码即可:

import urllib.request
import gzip
import os

# 模拟浏览器请求头,避免被服务器识别为爬虫
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
}

target_url = 'http://www.17500.cn/getData/ssq.TXT'
request = urllib.request.Request(target_url, headers=headers)

try:
    with urllib.request.urlopen(request) as response:
        # 检查响应是否为gzip压缩格式
        content_encoding = response.headers.get('Content-Encoding')
        if content_encoding == 'gzip':
            # 解压缩并按站点编码解码(实测该站点用GBK编码)
            content = gzip.decompress(response.read()).decode('gbk')
        else:
            content = response.read().decode('gbk')
        
        # 写入文件时指定对应编码,避免二次乱码
        with open('ssq.TXT', 'w', encoding='gbk') as output_file:
            output_file.write(content)
    print("文件下载保存成功!")
except Exception as e:
    print(f"下载过程出错:{str(e)}")

关键修复点说明:

  • 处理压缩内容:通过检查响应头的Content-Encoding字段,判断是否需要用gzip.decompress解压缩二进制数据,这解决了多数情况下的乱码问题。
  • 指定正确编码:该站点的文本编码是GBK而非通用的UTF-8,无论解压缩还是写入文件都要明确指定编码,避免编码不匹配导致的乱码。
  • 替代urlretrieve:urlretrieve属于较底层的工具,缺乏自动处理压缩、编码的能力,改用urlopen配合手动流程控制,能更稳定地处理这类动态响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:32:34