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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:33:26