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
相关产品推荐
相关产品推荐

