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

使用Selenium筛选Pinnacle在线投注元素,解决DataFrame索引不匹配问题

问题:爬取Pinnacle NBA球员投注数据时排除离线投注项

我正在爬取pinnacle.com的NBA球员投注数据,目标是排除离线投注的标题,避免生成DataFrame时出现球员名称(作为索引)和数据长度不匹配的问题。目前代码通过By.CLASS_NAME获取所有投注标题、投注项名称和赔率,但没法区分在线/离线投注,试过逻辑判断但返回的布尔值不能用作索引,求解决办法。

当前代码

driver.get("https://www.pinnacle.com/en/basketball/nba/brooklyn-nets-vs-charlotte-hornets/1564479365#player-props")

# 获取球员/投注类型名称
player_name_bet_search = driver.find_elements(By.CLASS_NAME, "style_titleText__35WhH")

# 获取投注项名称
odds_name_search = driver.find_elements(By.CLASS_NAME, "style_label__2KJur", "market-btn style_button__34Zqv style_pill__1NXWo style_horizontal__10PLW style_disabled__2uBLz")

# 获取赔率值
odds_values_search = driver.find_elements(By.CLASS_NAME, "style_price__15SlF")

解决方案

核心思路是按投注组过滤,只保留在线状态的投注组,避免全局取数导致的长度不匹配问题:

1. 按投注组筛选(推荐)

页面中每个球员的投注项会被包裹在一个父容器里,离线投注组会带有特定的禁用类(如style_disabled__2uBLz),通过遍历这些组并过滤离线项,就能保证数据关联正确:

driver.get("https://www.pinnacle.com/en/basketball/nba/brooklyn-nets-vs-charlotte-hornets/1564479365#player-props")

# 定位所有投注组的父容器(类名需根据页面实际结构确认,示例为常见结构)
bet_groups = driver.find_elements(By.CSS_SELECTOR, "div.style_group__2x3rX")

# 初始化存储数据的列表
player_bets = []
odds_names = []
odds_values = []

for group in bet_groups:
    # 检查当前组是否为离线状态(不包含禁用类则为在线)
    if "style_disabled__2uBLz" not in group.get_attribute("class"):
        # 提取当前组的球员/投注类型标题
        title = group.find_element(By.CLASS_NAME, "style_titleText__35WhH").text
        player_bets.append(title)
        
        # 提取当前组内的投注项名称
        group_odds_names = group.find_elements(By.CLASS_NAME, "style_label__2KJur")
        odds_names.extend([elem.text for elem in group_odds_names])
        
        # 提取当前组内的赔率值
        group_odds_values = group.find_elements(By.CLASS_NAME, "style_price__15SlF")
        odds_values.extend([elem.text for elem in group_odds_values])

2. 直接筛选非禁用的标题(备选)

如果暂时找不到合适的父容器,也可以直接用CSS选择器筛选非离线的投注标题,同时对应筛选投注项和赔率:

# 筛选所有非离线的投注标题
player_name_bet_search = driver.find_elements(By.CSS_SELECTOR, "div:not(.style_disabled__2uBLz) .style_titleText__35WhH")

# 对应筛选所有非离线的投注项和赔率
odds_name_search = driver.find_elements(By.CSS_SELECTOR, "div:not(.style_disabled__2uBLz) .style_label__2KJur")
odds_values_search = driver.find_elements(By.CSS_SELECTOR, "div:not(.style_disabled__2uBLz) .style_price__15SlF")

3. 验证数据一致性

处理完成后,检查数据长度是否匹配:

print(len(player_bets), len(odds_names), len(odds_values))
# 正常情况下,odds_names和odds_values的长度应该是player_bets的整数倍(比如每个球员对应2个投注项)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:35:50