使用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
相关产品推荐
相关产品推荐

