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

Python爬虫print输出正常 存入pd.DataFrame仅保留最后值如何解决

问题根因

你在for循环内部每次都重新创建新的DataFrame对象并覆盖new_df变量,之前循环生成的所有数据都会被后续覆盖,因此循环结束后仅能保留最后一条记录的结果。

解决方案

提前初始化一个空列表存储每条新闻的解析结果,全部循环完成后再统一转换为DataFrame,这也是批量结构化数据存储的最高效写法,修改后代码如下:

import pandas as pd
import newspaper
from newspaper import Article

df = pd.read_excel('1.xlsx')
urls = df['data'].to_list()

# 初始化空列表,用来存储每条解析结果
all_data = []

for url in urls:
    try:
        a = Article(url, language='id')
        a.download()
        a.parse()
        # 把单条新闻的所有字段整理成字典
        item = {
            'url': url, # 保留原url方便对应原始记录
            'author': a.authors,
            'publish_date': a.publish_date,
            'additional_data': a.additional_data,
            'content': a.text,
            'tags': list(a.tags), # set转list方便后续DataFrame处理
            'title': a.title,
            'keywords': a.keywords
        }
        all_data.append(item)
        print(item['author'], item['publish_date'], item['content'], item['title'], item['keywords'])
    except Exception as e:
        print(f"url {url} 爬取失败:{e}")
        # 如果需要保留爬取失败的url记录,可以解开下面这段注释
        # all_data.append({'url': url, 'author': None, 'publish_date': None, 'additional_data': None, 'content': None, 'tags': None, 'title': None, 'keywords': None})

# 所有循环结束后统一转DataFrame
new_df = pd.DataFrame(all_data)
# 后续可以直接导出到excel:new_df.to_excel('新闻采集结果.xlsx', index=False)

补充说明

  • 如果你只需要保留采集成功的记录,不需要额外处理异常分支;如果需要全量url对应结果,就打开异常分支里的append代码即可
  • tags字段默认是set类型,转成list后在DataFrame里处理、导出都会更方便

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:45:02