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

使用Selenium爬取无URL分页表格时触发StaleElementReferenceException如何解决

问题原因

你遇到的StaleElementReferenceException是Selenium分页场景的常见报错,核心原因是你在循环外提前查询了home、away对应的DOM元素,这些元素实例仅和第一页的文档树绑定,点击下一页触发页面DOM更新后,之前存储的元素引用已经和当前页脱离关联,调用.text属性就会抛出元素失效错误。

修复方案

把元素查询的逻辑移入分页循环内部,每次加载新页面后重新获取当前页的目标元素,同时可以把固定休眠替换为显式等待提升稳定性,修改后的代码如下:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

teams = []
page = 0
# 显式等待最长时间,可按需调整
wait = WebDriverWait(driver, 10)

while page < 10:
    page += 1
    # 等待当前页的主队元素加载完成,避免页面未渲染完成就取数据
    wait.until(EC.presence_of_element_located((By.XPATH, '//tbody/tr/td[5]')))
    # 每次进入新页面都重新查询当前页的主队、客队元素
    home = driver.find_elements(By.XPATH, '//tbody/tr/td[5]')
    away = driver.find_elements(By.XPATH, '//tbody/tr/td[7]')
    
    for i in range(len(home)):
        temp_data = home[i].text + '\n' + away[i].text
        teams.append(temp_data)
    
    # 最后一页不需要点击下一页,避免最后一页点击报错
    if page < 10:
        # 等待下一页按钮可点击再触发点击
        next_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="result-tables"]/div[3]/ul/li[12]/a/span')))
        next_btn.click()
        # 可选加短休眠等待页面切换完成,也可以用校验页码变化的逻辑替代
        time.sleep(2)
可选优化点
  • 点击下一页后可以加校验逻辑,判断当前页面已经完成切换(比如读取页码元素的文本变化),避免还停留在上一页拉取重复数据
  • 如果网站表格数据是通过接口异步加载的,可以直接抓接口获取数据,比爬取DOM效率更高、稳定性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:15:08