网页爬取内容存入CSV失败:仅首次迭代内容重复写入
问题分析与修复
你的代码主要有这几个问题:
- 在写入模式打开的文件上创建了
csv_reader,此时文件是空的,这个阅读器根本读不到任何内容,嵌套的for i in csv_reader循环只会执行一次(因为无内容可读),而且完全没必要这么做。 - 循环里手动
i+=1会打乱for i in range(lenght)的迭代逻辑,导致循环提前结束。 - 每次写入都把整个
headlines和descriptions列表写进去,而非当前迭代的单条数据,导致内容重复。 - 重复调用
soup.find_all('div',{'class':'eachStory'}),每次循环都重新查找DOM元素,既浪费资源又容易出错。
修复后的代码
import csv # 先一次性获取所有新闻元素,避免重复查找DOM stories = soup.find_all('div', {'class':'eachStory'}) with open('stocknews.csv','w', newline='') as new_file: csv_writer = csv.writer(new_file, delimiter=',') # 用CSV标准的逗号分隔,后期解析更稳妥 # 先写入表头 csv_writer.writerow(['headlines', 'descriptions']) # 循环处理每条新闻 for idx, story in enumerate(stories, start=1): print(f"{idx})") # 获取当前新闻的标题和描述 headline = story.find_all('a')[-1].text.strip() description = story.find('p').text.strip() # 直接找第一个p标签,比find_all[0]更简洁 print(headline) print(description) # 写入当前单条新闻数据 csv_writer.writerow([headline, description])
关键修改点
- 提前把所有新闻元素存入
stories变量,避免重复解析DOM结构。 - 去掉多余的
csv_reader和嵌套循环,直接在遍历新闻时写入单行数据。 - 用
enumerate获取循环索引,不用手动维护变量i,避免逻辑混乱。 - 加入
newline=''参数,避免Windows系统下写入CSV时出现多余空行。 - 每次只写入当前迭代的单条标题和描述,不会累积重复内容。
内容的提问来源于stack exchange,提问作者momo
相关产品推荐
相关产品推荐

