使用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
相关产品推荐
相关产品推荐

