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

如何清空复用列表,为DataFrame指定单元格存储Reddit爬取评论?

问题分析与解决

你的代码出现评论重复的问题,核心原因有两个:

  • 多余的while循环和for循环嵌套,导致列表lst没有在每个帖子处理前重新初始化
  • lst的初始化位置错误,复用了之前帖子的评论列表

错误逻辑拆解

原来的代码里,lst = []放在while循环内部、for循环外部,意味着每次进入while才创建一次空列表。但for循环会一次性遍历3个帖子:

  1. 处理第一个帖子时,lst被填充该帖子的评论,存入df.loc[1]
  2. 处理第二个帖子时,lst还是之前的那个列表(但因为第二个帖子评论数为0,直接用了['No comments'],没造成明显问题)
  3. 处理第三个帖子时,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)

关键改动说明

  1. 移除了多余的while循环,直接用enumerate遍历帖子并生成行索引i,逻辑更清晰
  2. 将lst = []移到for submission循环内部,每个帖子处理前都创建全新的空列表,彻底避免评论串用
  3. 简化了条件判断,把elif改成else,代码更简洁

这样修改后,每个帖子的评论都会存入独立的列表,第三条帖子的14条评论就能正确显示了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:02:15