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的可点击校验拦截;同时当按钮处于隐藏容器中时,原生点击逻辑会直接判定元素不可交互,无法完成展开操作。
修正方案
精准缩小定位范围,避免匹配冗余元素
不要直接使用全局通用的.more类定位,把原来所有基于class="more"的定位,替换为带容器限定的选择器:span.odds-co a.more这个选择器可以精准命中所有位于
odds-co容器下的Compare odds按钮,完全排除其他模块的冗余匹配。替换等待逻辑,适配动态渲染特性
不要使用要求全元素可见的等待条件,改用首元素存在性等待作为页面赔率区加载完成的判定: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")) )用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)补充分批加载处理
该页面的赔率表格是滚动到可视区才会加载后续行的,执行完上面的点击逻辑后,需要向下滚动页面1000px等待2秒,重新执行一次元素获取、点击的流程,重复3-4次即可覆盖所有档位的Compare odds展开操作。
内容的提问来源于stack exchange,提问作者BlackElefant
相关产品推荐
相关产品推荐

