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

网页爬取内容存入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 04:15:57