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

Python爬虫脚本无法生成Excel文件问题求助

问题:Python爬虫脚本无报错但无法生成Excel文件

我已经为编写这段Python脚本困扰数日,该脚本用于爬取数据并生成Excel文件作为输出。运行代码时无任何报错信息,但Excel文件始终无法生成。

我使用Windows 10系统,在Sublime Text中通过Python Build运行脚本,已安装脚本所需的所有包,确认拥有磁盘写入权限,但尝试的所有方法均无效。我试过更改目录、生成CSV文件替代Excel、在Sublime Text外的命令提示符中运行,但Excel文件仍无法生成。

附上代码:

import pandas as pd
from bs4 import BeautifulSoup
import requests

url = "https://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=y&type=1&season=2023&month=0&season1=2023&ind=0&team=0&rost=0&age=0&filter=&players=0&startdate=2023-01-01&enddate=2023-12-31&page=1_500"

html_content = requests.get(url).text

soup = BeautifulSoup(html_content, "lxml")

data = {}

leaders = soup.find("table", attrs={"class": "rgMasterTable"})
leaders_data = leaders.tbody.find_all("tr")

headings = []

for td in leaders_data[0].find_all("td"):
    if td.b:
        headings.append(td.b.text.replace('\n', '').strip())

for table, heading in zip(leaders_data[1].find_all("table"), headings):
    t_headers = []
    for th in table.find_all("th"):
        t_headers.append(th.text.replace('\n', '').strip())

    table_data = []
    for tr in table.tbody.find_all("tr"):
        t_row = {}
        for td, th in zip(tr.find_all("td"), t_headers):
            t_row[th] = td.text.replace('\n', '').strip()
        table_data.append(t_row)
    data[heading] = table_data

for topic, table in data.items():
    df = pd.DataFrame(table)

    excel_filename = "C:/Users/(myuser)/Documents/rake_list.xlsx"
    writer = pd.ExcelWriter(excel_filename, engine='xlsxwriter')
    df.to_excel(writer, index=False)
    writer.save()

import os
print(os.path.isfile("rake_list.xlsx")) 
#I've added this to see if it has saved elsewhere but it return "False"

我添加了os模块判断文件是否存在,返回结果为False。


解决方案

1. 路径匹配错误

你写入文件用的是绝对路径"C:/Users/(myuser)/Documents/rake_list.xlsx",但判断文件存在时用的是相对路径"rake_list.xlsx",两者指向的不是同一个位置,自然会返回False。修正判断代码:

print(os.path.isfile("C:/Users/(myuser)/Documents/rake_list.xlsx"))

2. 循环覆盖文件导致异常

代码在for topic, table in data.items()循环中,每次都会创建新的ExcelWriter并覆盖同一个文件。如果最后一次循环处理的表格为空,或者覆盖过程中文件损坏,就会出现文件无法正常生成的情况。

解决方式二选一:

  • 将所有表格写入同一个Excel的不同工作表:
excel_filename = "C:/Users/(myuser)/Documents/rake_list.xlsx"
writer = pd.ExcelWriter(excel_filename, engine='xlsxwriter')

for topic, table in data.items():
    df = pd.DataFrame(table)
    df.to_excel(writer, sheet_name=topic, index=False)

writer.save()
  • 为每个表格生成独立文件,避免覆盖:
for topic, table in data.items():
    df = pd.DataFrame(table)
    excel_filename = f"C:/Users/(myuser)/Documents/rake_list_{topic}.xlsx"
    writer = pd.ExcelWriter(excel_filename, engine='xlsxwriter')
    df.to_excel(writer, index=False)
    writer.save()

3. 改用上下文管理器确保文件写入完成

xlsxwriter的save()方法偶尔会出现写入不彻底的情况,改用上下文管理器可以自动处理文件的打开和关闭,更可靠:

with pd.ExcelWriter(excel_filename, engine='xlsxwriter') as writer:
    df.to_excel(writer, index=False)
# 无需手动调用save/close,上下文管理器会自动完成

4. 验证爬取数据是否有效

如果网页反爬导致获取的HTML内容为空,后续解析不到表格数据,写入的Excel也会异常。添加打印语句确认数据:

# 检查HTML是否获取成功
print("HTML内容长度:", len(html_content))
# 检查爬取到的表格数据
print("爬取到的表格数量:", len(data))
for topic, table in data.items():
    print(f"{topic}表格行数:", len(table))

如果HTML长度过小,说明被反爬,添加请求头模拟浏览器:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}
html_content = requests.get(url, headers=headers).text

内容的提问来源于stack exchange,提问作者IdeaMercenary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:00:36