使用BeautifulSoup和lxml实现Python论坛帖子爬取并存储至DataFrame
解决论坛帖子数据抓取并存入pandas DataFrame的问题
嘿,我懂你现在的需求啦——你想把论坛帖子里的用户名和对应内容都抓下来,整理成指定格式的pandas DataFrame,但之前的代码只拿到了内容,没搞定用户名和数据存储对吧?我来帮你调整一下:
首先,你现有代码的问题是只提取了帖子内容,没有定位到每个帖子对应的用户名,也没把数据整合到DataFrame里。咱们一步步来修改:
完整修改后的代码
import requests from bs4 import BeautifulSoup import pandas as pd # 目标论坛帖子URL url = 'http://www.catforum.com/forum/43-forum-fun/350938-count-one-billion-2016-a-120.html' # 获取页面内容 r = requests.get(url) # 用lxml解析(你已经导入了lxml,指定解析器更高效稳定) soup = BeautifulSoup(r.text, 'lxml') # 初始化两个列表,分别存储用户名和帖子内容 usernames = [] post_contents = [] # 遍历所有帖子内容的div for div in soup.select('[id^=post_message]'): # 找到当前帖子所在的父容器(论坛里每个帖子通常有独立包裹div,id以post_开头) post_container = div.find_parent('div', id=True) if post_container and post_container['id'].startswith('post_'): # 在父容器里定位用户名元素(这个论坛的用户名在class为bigusername的a标签里) username_tag = post_container.find('a', class_='bigusername') if username_tag: username = username_tag.get_text(strip=True) usernames.append(username) else: # 防止特殊情况找不到用户名,用占位符替代 usernames.append('Unknown User') else: usernames.append('Unknown User') # 获取帖子内容,保留换行格式 content = div.get_text("\n", strip=True) post_contents.append(content) # 把两个列表转换成你需要的DataFrame格式 df = pd.DataFrame({ 'col1': usernames, 'col2': post_contents }) # 打印前几行看看结果 print(df.head())
代码说明
- 用户名定位逻辑:通过
find_parent找到当前帖子内容所在的整个帖子容器,再在容器内提取用户名——这个逻辑适配了该论坛的页面结构,确保每段内容都能对应到正确的发帖人。 - 数据整合存储:用两个列表分别收集用户名和内容,最后通过pandas的
DataFrame方法直接转换成你需要的格式。 - 异常防护:加了多层判断,避免因为页面结构小变化导致的报错,遇到找不到用户名的情况会自动用
Unknown User占位。
运行这段代码后,你就能得到符合要求的DataFrame啦,每个用户名都会对应着他们发布的帖子内容~
内容的提问来源于stack exchange,提问作者OptimusPrime
相关产品推荐
相关产品推荐

