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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:42:16