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

BeautifulSoup find_all仅返回首个元素的爬取问题求助

问题分析与解决方案

你的代码核心问题是生成BeautifulSoup的时机错误——在点击所有展开按钮之前就已经获取了页面源码并生成了soup对象。后续点击展开操作会动态加载更多市场内容,但soup还是基于旧的DOM结构,所以只能拿到默认展开的第一个元素。

修正步骤

  1. 延迟生成BeautifulSoup:把soup = BeautifulSoup(driver.page_source, "lxml")移到所有展开按钮点击完成、页面更新之后。
  2. 替换固定sleep为显式等待:固定sleep容易受网络/页面加载速度影响,改用Selenium的WebDriverWait等待元素可交互,提升代码稳定性。
  3. 精准定位容器:如果页面存在多个赛事条目,需要确保找到对应赛事的event-row__expanded-markets容器,避免误取其他赛事内容。

修正后的代码

import time
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from urllib.parse import urlparse, parse_qs
import re
import pandas as pd

# 初始化浏览器(用Service方式适配新版ChromeDriver)
service = Service('C:/Users/tmarkac/source/repos/chromedriver.exe')
driver = webdriver.Chrome(service=service)
team_name = '替换为当前有效赛事/选手名称'

u = f'https://superbet.pl/wyszukaj?query={team_name}'
driver.get(u)
driver.maximize_window()

# 显式等待并点击Cookie同意按钮
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler"))).click()

# 等待所有展开按钮加载完成
expand_buttons = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.event-row__expanded-market-icon.icon-chevron_down')))

# 遍历点击所有展开按钮(用JS点击避免元素遮挡)
for btn in expand_buttons:
    driver.execute_script("arguments[0].click();", btn)
    time.sleep(0.5)

# 等待市场内容加载完成后,再生成soup
wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'event-row__expanded-market')))
soup = BeautifulSoup(driver.page_source, "lxml")

# 定位目标赛事的市场容器(通过赛事名称筛选,避免多赛事混淆)
market_containers = soup.find_all('div', class_='event-row__expanded-markets')
for container in market_containers:
    # 查找当前容器对应的赛事名称元素
    team_element = container.find_previous(class_='event-row__participants')
    if team_element and team_name in team_element.get_text(strip=True):
        markets_html = container.find_all('div', class_='event-row__expanded-market')
        print(f"找到{len(markets_html)}个市场元素")
        break

driver.quit()

额外说明

  • 用WebDriverWait替代固定time.sleep,确保元素加载完成后再操作,降低页面加载慢导致的错误概率。
  • 采用JS点击展开按钮,避免页面元素遮挡引发的点击失败问题。
  • 增加赛事名称匹配逻辑,确保获取的是目标赛事的市场数据,避免页面存在多个赛事时的混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:10:33