BeautifulSoup find_all仅返回首个元素的爬取问题求助
问题分析与解决方案
你的代码核心问题是生成BeautifulSoup的时机错误——在点击所有展开按钮之前就已经获取了页面源码并生成了soup对象。后续点击展开操作会动态加载更多市场内容,但soup还是基于旧的DOM结构,所以只能拿到默认展开的第一个元素。
修正步骤
- 延迟生成BeautifulSoup:把
soup = BeautifulSoup(driver.page_source, "lxml")移到所有展开按钮点击完成、页面更新之后。 - 替换固定sleep为显式等待:固定sleep容易受网络/页面加载速度影响,改用Selenium的
WebDriverWait等待元素可交互,提升代码稳定性。 - 精准定位容器:如果页面存在多个赛事条目,需要确保找到对应赛事的
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
相关产品推荐
相关产品推荐

