如何将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})
快速排查步骤
- 先打印
print(len(all_data)),看看列表长度是不是等于你爬取到的动画数量,如果是1,说明收集数据的环节有问题,检查循环逻辑。 - 打印
print(all_data),确认所有爬取到的条目都在列表里。 - 检查写入CSV的代码是不是在循环内部,有没有用错文件打开模式。
内容的提问来源于stack exchange,提问作者user20784428
相关产品推荐
相关产品推荐

