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

如何将bs4爬取数据转为CSV?仅导出最后一组数据问题求助

爬取MyAnimeList季番数据写入CSV仅存最后一条的问题解决

核心问题排查与修复

1. 列表初始化位置错误

如果你的all_data是在遍历动画条目的循环内部定义的(比如每次循环都写all_data = []),那每次循环都会清空之前的数据,最后自然只剩最后一条。

改法:把列表初始化移到循环外面:

# 先在循环外创建空列表
all_data = []

# 遍历每个动画条目
for anime in soup.select('.js-anime-category-producer'):
    # 提取标题、评分等数据
    title = anime.find('h2', class_='h2_anime_title').text.strip()
    score = anime.find('div', class_='score').text.strip()
    # 把单条数据追加到列表里
    all_data.append({'标题': title, '评分': score})

2. CSV写入模式或位置错误

要是你把写入CSV的代码放在循环里,还每次用w模式打开文件,那每次都会覆盖之前的内容,最后只剩最后一条。

两种修复方式:

  • 方式一:先爬完所有数据,一次性写入(推荐)
import csv

# 所有数据收集完成后,统一写入
with open('anime_season.csv', 'w', newline='', encoding='utf-8') as f:
    # 定义表头
    writer = csv.DictWriter(f, fieldnames=['标题', '评分'])
    writer.writeheader()
    # 写入整个列表的所有数据
    writer.writerows(all_data)
  • 方式二:边爬边写(适合数据量极大的情况)
import csv

# 先写一次表头
with open('anime_season.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=['标题', '评分'])
    writer.writeheader()

# 循环里追加数据
for anime in soup.select('.js-anime-category-producer'):
    data = {'标题': title, '评分': score}
    with open('anime_season.csv', 'a', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=['标题', '评分'])
        writer.writerow(data)

3. 数据添加方式错误

如果你不是用append往列表加数据,而是直接赋值(比如all_data = {'标题': title}),那每次都会把之前的内容覆盖,最后只剩最后一条。

改法:必须用append方法把单条数据加入列表:

# 错误写法:直接覆盖列表
all_data = {'标题': title, '评分': score}

# 正确写法:追加数据到列表
all_data.append({'标题': title, '评分': score})

快速排查步骤

  1. 先打印print(len(all_data)),看看列表长度是不是等于你爬取到的动画数量,如果是1,说明收集数据的环节有问题,检查循环逻辑。
  2. 打印print(all_data),确认所有爬取到的条目都在列表里。
  3. 检查写入CSV的代码是不是在循环内部,有没有用错文件打开模式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:45:35