使用utf-8解码Yahoo财经URL时遇UnicodeDecodeError,求解决方法
解决Python中Yahoo Finance数据解码的UnicodeDecodeError问题
先修正代码中的语法错误
你代码里有一行单独的https://finance.yahoo.com/quote/AAPL,这不是合法的Python语句,会直接导致代码运行失败,必须删除这一行。
错误核心原因
出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b的本质是:Yahoo Finance返回的响应内容是gzip压缩格式的二进制数据,你直接用utf-8解码压缩后的原始字节,自然会失败(0x8b是gzip压缩数据的标志性起始字节)。
方案一:用urllib手动处理gzip压缩
导入gzip模块,先判断响应是否为gzip压缩,解压后再解码:
import re import urllib.request import gzip url = "https://finance.yahoo.com/quote/" stock = input("Enter your stock: ") url = url + stock print(url) response = urllib.request.urlopen(url) # 检查响应的压缩编码 encoding = response.info().get('Content-Encoding') if encoding == 'gzip': # 解压gzip格式数据 data = gzip.decompress(response.read()) else: data = response.read() # 正常解码为utf-8文本 data1 = data.decode("utf-8") # 打印前500个字符验证结果 print(data1[:500])
方案二:用requests库(推荐新手,更简洁)
requests库会自动识别并处理gzip压缩,无需手动操作,代码可读性更高:
- 先安装requests:在命令行执行
pip install requests - 修改后的代码:
import re import requests url = "https://finance.yahoo.com/quote/" stock = input("Enter your stock: ") url = url + stock print(url) # requests自动完成压缩处理与解码 response = requests.get(url) data1 = response.text # 打印前500个字符验证结果 print(data1[:500])
补充说明
别人的代码能运行可能是因为当时Yahoo Finance未启用gzip压缩,或者对方的代码中已经包含了压缩处理逻辑但你没注意到。
内容的提问来源于stack exchange,提问作者luca dahlmann
相关产品推荐
相关产品推荐

