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

Python Selenium爬取KRS网站返回页面时遇Stale Element错误

解决Selenium爬虫返回页面后Stale Element Reference错误的方案

问题根源

当调用driver.back()回到原页面时,页面DOM会被重新渲染,之前提前获取的tr_elements、td_content、a_tags等元素对象会失效,变成过期元素(Stale Element),继续使用这些旧对象就会触发stale element reference错误,导致循环中断。

修复方案

核心思路是不依赖提前获取的DOM元素对象循环,先收集所有需要访问的链接(或元素定位标识),再逐个处理,每次回到页面后重新定位元素或直接用链接跳转。同时替换已弃用的旧API,使用Selenium 4.x的新定位方式。

修改后的代码

from selenium.webdriver.common.by import By
import time

# 先在初始页面收集所有需要点击的a标签链接
target_links = []
tr_elements = driver.find_elements(By.TAG_NAME, 'tr')
for tr_element in tr_elements:
    td_elements = tr_element.find_elements(By.TAG_NAME, 'td')
    if td_elements:
        for td_content in td_elements:
            a_tags = td_content.find_elements(By.TAG_NAME, 'a')
            if a_tags:
                for a_tag in a_tags:
                    # 收集每个a标签的href链接
                    link = a_tag.get_attribute('href')
                    if link:
                        target_links.append(link)

# 循环处理每个链接
current_url = driver.current_url  # 保存初始搜索页URL
for link in target_links:
    try:
        # 直接访问目标链接,避免依赖旧元素点击
        driver.get(link)
        time.sleep(5)

        # 提取目标数据
        name_div = driver.find_element(By.XPATH, "//div[contains(text(), 'Nazwa')]/following-sibling::div")
        register_div = driver.find_element(By.XPATH, "//div[contains(text(), 'Rejestr')]/following-sibling::div")
        translated_text = translator.translate(register_div.text, src='pl', dest='en')
        krs_div = driver.find_element(By.XPATH, "//div[contains(text(), 'Numer KRS')]/following-sibling::div")
        date_div = driver.find_element(By.XPATH, "//div[contains(text(), 'Data wpisu do Rejestru Przedsiębiorców')]/following-sibling::div")

        # 可添加数据保存逻辑,示例为打印
        print(f"名称: {name_div.text}, 注册类型(英文): {translated_text.text}, KRS号: {krs_div.text}, 注册日期: {date_div.text}")

        # 回到初始搜索页
        driver.get(current_url)
        time.sleep(5)

    except Exception as e:
        print(f"处理链接 {link} 时出错: {str(e)}")
        # 出错后强制回到初始页,避免后续循环受影响
        driver.get(current_url)
        time.sleep(5)

关键改动说明

  1. 提前收集链接:先遍历页面所有a标签,把需要访问的链接存入列表,彻底摆脱对旧DOM元素的依赖。
  2. 直接用链接跳转:替换元素点击逻辑为driver.get(link),避免元素点击相关异常,稳定性更高。
  3. 使用新定位API:用find_elements(By.TAG_NAME, 'xxx')替换已弃用的find_elements_by_tag_name,符合Selenium最新规范。
  4. 简化数据提取:合并XPath定位逻辑,减少冗余代码。
  5. 异常处理优化:出错后强制回到初始搜索页,确保后续循环能正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:07:42