使用Python批量抓取URL列表并保存为CSV的问题排查
问题分析与修复方案
你的代码核心问题是每次循环打开文件后,调用get_data(link)会遍历所有URL并写入当前文件,如果第二个URL请求出现异常,就会出现两个文件都只写入第一个URL数据的情况。以下是修复后的代码和关键修改说明:
修复后的代码
import csv import requests from bs4 import BeautifulSoup link = ['https://www.health.ny.gov/statistics/sparcs/reports/audit/Emergency_Department_19.html', 'https://www.health.ny.gov/statistics/sparcs/reports/audit/Emergency_Department_20.html'] def get_data(url): res = requests.get(url) res.raise_for_status() # 请求失败时抛出异常,便于排查问题 soup = BeautifulSoup(res.text,"lxml") # 提取当前页面的所有表格行数据 return [[item.get_text(strip=True) for item in items.select("th,td")] for items in soup.select("table.table tr")] if __name__ == '__main__': for url in link: # 从URL中提取文件名 filename = url.split('audit/')[-1].replace('.html', '.csv') with open(filename, "w", newline="", encoding="utf-8") as infile: writer = csv.writer(infile) # 获取当前URL的数据并写入文件 rows = get_data(url) writer.writerows(rows)
关键修改点
- 重构
get_data函数:改为接收单个URL,返回对应页面的表格数据,消除对全局writer的依赖,逻辑更独立。 - 调整主循环逻辑:遍历每个URL时,仅处理当前URL的数据,写入对应的CSV文件,实现“一个URL对应一个文件”的需求。
- 添加异常检测:
res.raise_for_status()会在URL请求失败时主动抛出异常,方便排查网络或页面访问问题。 - 指定文件编码:添加
encoding="utf-8"避免写入时出现字符乱码。 - 简化文件名生成:用
replace替代两次split操作,代码更简洁。
内容的提问来源于stack exchange,提问作者6114617
相关产品推荐
相关产品推荐

