Python&Pandas:pd.read_excel读取requests返回content报错File is not a zipfile
解决方案
该报错是openpyxl读取.xlsx格式文件时,未获取到合法的zip格式二进制流导致,可按以下步骤逐一排查解决:
- 第一步:校验请求返回内容是否为合法Excel
你当前脚本缺少响应合法性校验,即使浏览器可正常下载,也可能因为请求缺头、cookie过期、服务端反爬拦截等原因,拿到的是错误页面/接口报错的非Excel内容。添加以下代码验证:
requests.packages.urllib3.disable_warnings() excel_a = requests.get(link_a, verify=False, cookies=a) # 新增校验代码 print(excel_a.status_code) print(excel_a.headers.get("Content-Type")) # 将返回内容写入本地手动验证 with open("debug.xlsx", "wb") as f: f.write(excel_a.content)
正常Excel的响应状态码为200,Content-Type值为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,如果不符合以上特征,说明请求被拦截,需要补全请求头参数,示例如下:
# 补充浏览器请求带的必要头字段,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Referer": link_a.split("/")[0] + "//" + link_a.split("/")[2] # 替换为Excel所属页面的地址 } excel_a = requests.get(link_a, verify=False, cookies=a, headers=headers)
- 第二步:适配字节流读取逻辑
如果确认返回内容是合法Excel,大概率是Pandas 1.3.x版本直接读取bytes存在兼容性问题,将内容封装为BytesIO对象后传入即可:
from io import BytesIO df = pd.read_excel(BytesIO(excel_a.content), engine="openpyxl")
- 第三步:修复版本兼容性
如果以上操作都无效,你当前使用的Pandas 1.3.1与openpyxl 3.0.7存在已知适配bug,替换为以下稳定兼容版本组合即可解决:
pip install pandas==1.4.2 openpyxl==3.0.10
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

