Python爬取下载的xlsx文件打开报错如何排查解决
Python爬取选举结果xlsx文件损坏问题排查与修复
核心问题原因
下载的文件无法打开,本质是获取到的内容根本不是合法的Excel二进制文件,是错误HTML页面,只是被强行命名为.xlsx后缀,Excel自然无法识别。
排查思路
- 本地文件格式校验:选中任意一个下载完成的文件,用记事本等纯文本编辑器打开,如果文件开头出现
<html>、<!DOCTYPE html>字样,即可确认下载到的是网页内容而非Excel文件。 - 链接逻辑校验:原代码手动拼接URL时错误把页面锚点(
#accordion2022ge部分)拼入下载地址,不符合URL路径规则,生成的是无效地址,服务器返回错误页而非目标文件。 - 请求逻辑校验:原代码使用
urlretrieve发起请求时,没有携带预先定义的浏览器UA头,站点反爬机制会拦截这类默认爬虫请求,返回403/拦截页面。
修复方案
替换原有错误的链接拼接、文件下载逻辑,使用标准URL拼接方法、带合法请求头的方式下载文件,修复后代码如下:
import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36" } page_url = "https://www.elections.on.ca/en/resource-centre/elections-results.html" # 获取列表页内容 page_resp = requests.get(page_url, headers=headers) page_resp.raise_for_status() soup = BeautifulSoup(page_resp.text, "html.parser") for link in soup.find_all('a', href=True): href = link['href'] # 筛选xlsx格式链接 if '.xlsx' in href.lower(): # 自动拼接相对路径为完整合法下载链接,自动处理路径层级,不会带入锚点 download_url = urljoin(page_url, href) # 提取真实文件名 save_name = download_url.split("/")[-1] print(f"下载文件:{save_name}") # 发起文件下载请求,携带请求头 file_resp = requests.get(download_url, headers=headers) file_resp.raise_for_status() # 二进制模式写入本地,保证文件内容不被转码损坏 with open(save_name, "wb") as f: f.write(file_resp.content)
运行上述代码后,下载得到的文件为标准xlsx格式二进制文件,可直接用Excel正常打开,不会触发格式错误。
内容的提问来源于stack exchange,提问作者Isaac A
相关产品推荐
相关产品推荐

