如何清空复用列表,为DataFrame指定单元格存储Reddit爬取评论?
问题分析与解决
你的代码出现评论重复的问题,核心原因有两个:
- 多余的
while循环和for循环嵌套,导致列表lst没有在每个帖子处理前重新初始化 lst的初始化位置错误,复用了之前帖子的评论列表
错误逻辑拆解
原来的代码里,lst = []放在while循环内部、for循环外部,意味着每次进入while才创建一次空列表。但for循环会一次性遍历3个帖子:
- 处理第一个帖子时,
lst被填充该帖子的评论,存入df.loc[1] - 处理第二个帖子时,
lst还是之前的那个列表(但因为第二个帖子评论数为0,直接用了['No comments'],没造成明显问题) - 处理第三个帖子时,
lst依然保留着第一个帖子的评论,直接被赋值给第三条数据,导致重复
修正后的代码
import praw import pandas as pd import os from dotenv import load_dotenv, find_dotenv load_dotenv(find_dotenv()) df = pd.DataFrame(columns=['Title', 'Number of comments', 'Comments']) reddit_read_only = praw.Reddit( client_id=os.environ.get("client_id"), client_secret=os.environ.get("client_secret"), user_agent=os.environ.get("user_agent") ) def web_scrap_reddit(name, value): subreddit = reddit_read_only.subreddit(name) # 用enumerate获取索引,从1开始对应df的行号 for i, submission in enumerate(subreddit.hot(limit=value), start=1): lst = [] # 每个帖子处理前都初始化空列表 if submission.num_comments != 0: for comment in submission.comments.list(): lst.append(comment.body) df.loc[i] = [submission.title, submission.num_comments, lst] else: df.loc[i] = [submission.title, submission.num_comments, ['No comments']] print(df.head()) # df.to_csv('Reddit_web_scrap1.csv', index=False) web_scrap_reddit('Python', 3)
关键改动说明
- 移除了多余的
while循环,直接用enumerate遍历帖子并生成行索引i,逻辑更清晰 - 将
lst = []移到for submission循环内部,每个帖子处理前都创建全新的空列表,彻底避免评论串用 - 简化了条件判断,把
elif改成else,代码更简洁
这样修改后,每个帖子的评论都会存入独立的列表,第三条帖子的14条评论就能正确显示了。
内容的提问来源于stack exchange,提问作者Hardik_Zalavadiya
相关产品推荐
相关产品推荐

