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)
关键改动说明
- 提前收集链接:先遍历页面所有a标签,把需要访问的链接存入列表,彻底摆脱对旧DOM元素的依赖。
- 直接用链接跳转:替换元素点击逻辑为
driver.get(link),避免元素点击相关异常,稳定性更高。 - 使用新定位API:用
find_elements(By.TAG_NAME, 'xxx')替换已弃用的find_elements_by_tag_name,符合Selenium最新规范。 - 简化数据提取:合并XPath定位逻辑,减少冗余代码。
- 异常处理优化:出错后强制回到初始搜索页,确保后续循环能正常执行。
内容的提问来源于stack exchange,提问作者Awanish Mishra
相关产品推荐
相关产品推荐

