如何用Selenium按类名文本筛选元素?PGA赔率爬取求助
解决Bovada PGA巡回赛「Outright Live」赔率筛选与DataFrame生成问题
核心问题分析
你之前的代码全局抓取所有类别的元素,没有建立「赔率类别」和「对应选手/赔率」的关联,导致无法精准筛选目标内容。要解决这个问题,关键是先定位到「Outright Live」的区块,再在该区块内抓取对应的选手和赔率数据。
修正后的代码
import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = "https://www.bovada.lv/sports/golf/pga-tour" # 初始化浏览器 browser = webdriver.Chrome() browser.get(url) # 显式等待页面加载,比implicitly_wait更可靠 wait = WebDriverWait(browser, 10) try: # 定位到「Outright Live」的赔率区块:先找到对应的market-name元素,再获取其父容器 outright_live_market = wait.until( EC.presence_of_element_located( (By.XPATH, "//div[contains(@class, 'market-name') and text()='Outright Live']/../..") ) ) # 在该区块内抓取选手和赔率 players = outright_live_market.find_elements(By.CLASS_NAME, "outcomes") odds = outright_live_market.find_elements(By.CLASS_NAME, "bet-price") # 整理数据:确保选手和赔率数量匹配 data = [] event_title = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "market-header"))).text for player, odd in zip(players, odds): data.append({ "赛事": event_title, "选手": player.text.strip(), "赔率": odd.text.strip() }) # 生成DataFrame df = pd.DataFrame(data) print(df) finally: # 关闭浏览器 browser.quit()
关键优化点
- 精准定位区块:用XPath找到文本为「Outright Live」的
market-name元素,然后通过层级定位到包含该类别所有选手和赔率的父容器,确保只抓取目标类别的数据。 - 显式等待:使用
WebDriverWait替代隐式等待,避免因页面动态加载导致的元素找不到问题。 - 数据关联:在目标区块内抓取子元素,自然建立了「类别-选手-赔率」的关联,不会混进其他类别的数据。
- 资源清理:用
try...finally确保浏览器会被关闭,避免资源泄漏。
可能的调整点
如果XPath定位父容器失败,可以检查页面的HTML结构,调整XPath层级(比如把/../..改成/parent::div/parent::div更清晰)。另外,如果页面需要滚动才能看到「Outright Live」区块,可以在定位前添加滚动代码:
# 滚动到页面底部,触发动态加载 browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") wait.until(EC.presence_of_element_located((By.CLASS_NAME, "market-name")))
内容的提问来源于stack exchange,提问作者barkey2121
相关产品推荐
相关产品推荐

