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
相关产品推荐
相关产品推荐

