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

Webscrape结果导出CSV遇问题:两种方法均无法运行求助

脚本整合后无法导出CSV文件的问题及解决

问题描述

我想把脚本输出保存到新CSV文件,作为新手尝试了两种单独运行有效的导出方法,但整合到完整脚本后都失效了。想知道是脚本其他部分有问题,还是存在操作限制,不理解为什么两种方法在其他场景能用。

第一段尝试代码

import requests
import pandas as pd
import csv


headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}

urls = [
    'https://stats.ncaa.org/game/play_by_play/12465',
    'https://stats.ncaa.org/game/play_by_play/12755',
    'https://stats.ncaa.org/game/play_by_play/12640',
    'https://stats.ncaa.org/game/play_by_play/12290',
]
s = requests.Session()
s.headers.update(headers)
for url in urls:
    r = s.get(url)
    dfs = pd.read_html(r.text).to_csv('out.csv', index=False)
    len(dfs)
    for df in dfs:
        print(df)
        print('___________')

第二段尝试代码

import requests
import pandas as pd
import csv


headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}

urls = [
    'https://stats.ncaa.org/game/play_by_play/12465',
    'https://stats.ncaa.org/game/play_by_play/12755',
    'https://stats.ncaa.org/game/play_by_play/12640',
    'https://stats.ncaa.org/game/play_by_play/12290',
]
s = requests.Session()
s.headers.update(headers)
for url in urls:
    r = s.get(url)
    dfs = pd.read_html(r.text)
    len(dfs)
    for df in dfs:
        with open('pbptest.csv', 'w') as f:
            writer = csv.writer(f)
            writer.writerow(df)
        print(df)
        print('___________')

问题分析与解决

第一段代码的问题

  1. pd.read_html(r.text)返回的是DataFrame对象的列表,不能直接调用.to_csv()方法,这行代码会直接报错。
  2. 即使强行调用,.to_csv()方法返回的是None,后续for df in dfs会因为遍历None而抛出异常。
  3. len(dfs)这行代码没有实际作用,只是计算列表长度但没赋值或使用。

第二段代码的问题

  1. 使用csv.writerow(df)时,df是DataFrame对象,writerow会把整个DataFrame当成单一元素写入,导致CSV内容混乱。
  2. 每次循环都用open('pbptest.csv', 'w')模式打开文件,会覆盖之前写入的内容,最终只会保留最后一个URL的最后一个表格数据。

修正后的代码示例

下面是两种可行的方案:

方案1:逐个追加写入CSV(保留所有表格)

import requests
import pandas as pd

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}

urls = [
    'https://stats.ncaa.org/game/play_by_play/12465',
    'https://stats.ncaa.org/game/play_by_play/12755',
    'https://stats.ncaa.org/game/play_by_play/12640',
    'https://stats.ncaa.org/game/play_by_play/12290',
]

s = requests.Session()
s.headers.update(headers)
# 控制表头只写入一次
first_write = True

for url in urls:
    r = s.get(url)
    dfs = pd.read_html(r.text)
    for df in dfs:
        # 追加模式写入,第一次写入表头,后续跳过
        df.to_csv('combined_output.csv', mode='a', index=False, header=first_write)
        first_write = False
        print(df)
        print('___________')

方案2:收集所有数据后一次性写入

import requests
import pandas as pd

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}

urls = [
    'https://stats.ncaa.org/game/play_by_play/12465',
    'https://stats.ncaa.org/game/play_by_play/12755',
    'https://stats.ncaa.org/game/play_by_play/12640',
    'https://stats.ncaa.org/game/play_by_play/12290',
]

s = requests.Session()
s.headers.update(headers)
all_data = []

for url in urls:
    r = s.get(url)
    dfs = pd.read_html(r.text)
    for df in dfs:
        all_data.append(df)
        print(df)
        print('___________')

# 合并所有DataFrame并写入CSV
combined_df = pd.concat(all_data, ignore_index=True)
combined_df.to_csv('combined_output.csv', index=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:48:25