Python爬虫存储CSV仅写入单行,如何实现多行数据写入?
解决CSV仅写入单行数据的问题
你的核心问题是写入CSV行的代码在循环外部,循环里仅生成了最后一次迭代的data,最终只写入这一行数据。以下是具体修复方案:
问题根源
当前代码中,writer.writerow(data)是在for lis in lists:循环结束后执行的,所以只会把循环最后一次生成的data写入CSV文件,自然只有单行数据。
修正步骤与完整代码
- 将
writer.writerow(data)移动到for循环内部,确保每遍历到一个lis就写入对应行的数据。 - 改用
with语句管理文件,自动处理文件的打开/关闭,避免手动close()可能出现的异常。 - 修正图片链接的提取逻辑:原代码中
lis.find('span', class_="https://thecryptobasic.com")写法错误,class_参数用于匹配类名而非网址,需提取图片标签的src属性(假设目标图片在<img>标签中)。
修复后的代码:
import csv from bs4 import BeautifulSoup # 假设你使用BeautifulSoup解析HTML # 假设lists是你解析得到的目标列表(如soup.find_all('li')) header = ['标题', '标签', '时间', '地址', '图片链接'] # 替换为你的实际表头 # 使用with语句自动管理文件生命周期 with open('output.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 先写入表头 writer.writerow(header) for lis in lists: title = lis.find('a', class_="title").text.strip() # 去除文本多余空白 tag = lis.find('span', class_="etc-mark").text.strip() datetime = lis.find('span', class_="datetime").text.strip() address = lis.find('div', class_="middle-xs").text.strip() # 修正图片链接提取:处理图片不存在的情况避免报错 img_tag = lis.find('img') img = img_tag['src'] if img_tag else '无图片' data = [title, tag, datetime, address, img] print(data) # 每次循环写入当前行数据 writer.writerow(data)
额外优化提示
- 添加
encoding='utf-8'避免中文乱码问题。 newline=''是csv模块官方推荐写法,可避免Windows系统下生成的CSV出现空行。- 用
strip()清理文本中的换行、空格,让CSV数据更整洁。 - 增加图片标签不存在的判断逻辑,防止代码因缺失元素报错。
内容的提问来源于stack exchange,提问作者Abdul Rehman
相关产品推荐
相关产品推荐

