You need to enable JavaScript to run this app. Python Selenium 爬取Oddsportal时Compare odds类元素无法点击问题
优惠活动
大模型
产品
解决方案
定价
更多

Python Selenium 爬取Oddsportal时Compare odds类元素无法点击问题

问题根源

当前定位超时、仅返回1个元素、点击失效的问题,由三点直接原因导致:

  • 全局使用.more类名定位会匹配到大量非目标元素:Oddsportal页面的侧边栏、页脚、其他功能模块都复用了more类名,你仅能拿到1个定位结果,本质是匹配到了首屏其他模块的同名类元素,而非赔率区的Compare odds按钮。
  • 等待条件不匹配元素状态:你使用的visibility_of_all_elements_located要求所有匹配元素必须在可视区域、具备实际可见宽高,但Compare odds按钮所在的大小球赔率表格是分批滚动渲染的,初始DOM中不存在未滚动区域的按钮;同时部分按钮的父容器默认设置为display:none,本身就不符合可见判定标准,自然会触发等待超时。
  • 点击逻辑被页面拦截:目标按钮是带空href的<a>标签,上层存在悬浮遮罩、提示块,普通原生点击会被Selenium的可点击校验拦截;同时当按钮处于隐藏容器中时,原生点击逻辑会直接判定元素不可交互,无法完成展开操作。
修正方案
  1. 精准缩小定位范围,避免匹配冗余元素
    不要直接使用全局通用的.more类定位,把原来所有基于class="more"的定位,替换为带容器限定的选择器:

    span.odds-co a.more
    

    这个选择器可以精准命中所有位于odds-co容器下的Compare odds按钮,完全排除其他模块的冗余匹配。

  2. 替换等待逻辑,适配动态渲染特性
    不要使用要求全元素可见的等待条件,改用首元素存在性等待作为页面赔率区加载完成的判定:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    WebDriverWait(browser, 15).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "span.odds-co a.more"))
    )
    
  3. 用JS触发点击,绕开可点击性校验
    遍历所有已加载的目标按钮,统一执行JS点击,不需要依赖Selenium的原生点击校验逻辑:

    all_compare_btns = browser.find_elements(By.CSS_SELECTOR, "span.odds-co a.more")
    for btn in all_compare_btns:
        browser.execute_script("arguments[0].click();", btn)
    
  4. 补充分批加载处理
    该页面的赔率表格是滚动到可视区才会加载后续行的,执行完上面的点击逻辑后,需要向下滚动页面1000px等待2秒,重新执行一次元素获取、点击的流程,重复3-4次即可覆盖所有档位的Compare odds展开操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 00:54:04