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

如何用Selenium和BeautifulSoup抓取指定类div下的嵌套div到列表?

解决嵌套div内容抓取的问题

嘿,我看了你的代码和遇到的问题,核心问题其实是嵌套循环的遍历范围没搞对,还有对BeautifulSoup的子元素获取逻辑不太熟,咱们一步步来修正:

问题出在哪?

  1. 你第一个版本的代码里,内层循环用了soup.find_all('div')——这可就麻烦了,这是在遍历整个页面的所有div,而不是当前那个rgt-col类div下面的子div。所以每循环一个rgt-col,就把全页面的div文本都塞一遍到列表里,数据会超级冗余,看起来就像“无限循环”了。
  2. 你后来改的代码只取了test.div.text,这是因为BeautifulSoup里.div的特性:它只会返回当前元素下的第一个子div,所以自然只能拿到第一个嵌套div的内容。

修正后的代码

from selenium import webdriver
from bs4 import BeautifulSoup
import time

driver = webdriver.Firefox(executable_path="/Users/myuser/Documents/geckodriverfolder/geckodriver")
driver.get('https://rotogrinders.com/projected-stats?site=draftkings&sport=nba')
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 加个短等待,确保滚动后页面内容加载完成
time.sleep(2)
html = driver.page_source
soup = BeautifulSoup(html, 'lxml')
salary_opp = []

# 外层循环:找到所有带rgt-col类的父div
for parent_div in soup.find_all('div', class_='rgt-col'):
    # 内层循环:只遍历当前父div下的所有子div(重点!不是整个页面的div)
    for child_div in parent_div.find_all('div'):
        div_text = child_div.text.strip()  # 去掉文本前后的空格、换行
        # 可选:过滤掉空内容的div,避免列表里存一堆空字符串
        if div_text:
            salary_opp.append(div_text)

print(salary_opp)
driver.quit()  # 记得用完关闭浏览器哦

关键逻辑说明

  • 嵌套遍历的正确姿势:外层拿到每个rgt-col父容器后,内层循环必须基于这个父容器调用find_all('div'),这样才只会遍历当前父容器下的子div,不会跑到整个页面乱找。
  • 文本清理:用.strip()处理文本,能去掉多余的空格和换行;加个非空判断,过滤掉那些没有有效内容的空div。
  • 页面等待:滚动后加个短等待很重要,不然页面可能还没加载完就抓html,会漏掉部分数据。

额外小优化

如果你只需要rgt-col下的直接子div(不想深入到更深的嵌套层级里),可以把内层循环改成:

for child_div in parent_div.find_all('div', recursive=False):

这样就只会取父div下第一级的子div,不会往下钻更深的嵌套。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:41:48