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

使用Python和Selenium遍历新闻网站文章时遭遇StaleElementReferenceException的问题排查

解决Selenium中的StaleElementReferenceException问题

这个报错的核心原因很直白:当你点击第一个链接进入文章详情页时,原来的列表页DOM已经被完全替换了——你存在all_links里的那些元素,属于之前列表页的DOM节点,页面跳转后它们就不再附着在当前页面的文档上了,遍历到第二个元素时自然就会触发失效报错。

你之前尝试的time.sleep()或者driver.back()之所以没用,是因为哪怕回到列表页,原来all_links里的元素还是旧DOM的引用,已经彻底失效,浏览器不会把它们和新加载的页面元素关联起来。

正确的解决思路

提前把所有文章的链接地址提取出来(存成字符串列表),而不是保存DOM元素引用。字符串不会受DOM变化的影响,之后直接遍历这个链接列表,逐个访问即可。

修改后的代码示例

import time
from selenium import webdriver

# 先提取所有文章的链接地址,存到列表里
all_link_urls = []
link_elements = driver.find_elements_by_tag_name('article.post a')
for element in link_elements:
    href = element.get_attribute('href')
    if href:  # 过滤掉无效的空链接
        all_link_urls.append(href)

print(f"共获取到 {len(all_link_urls)} 篇文章链接")

# 遍历链接列表,逐个访问详情页
for url in all_link_urls:
    driver.get(url)
    time.sleep(1)  # 简单等待页面加载,后续可以换成更可靠的显式等待
    
    # 提取日期
    date = driver.find_element_by_tag_name('article header span.no-break-text.lite').text
    print(date)

进阶优化建议

固定时长的time.sleep()不够可靠(网络波动时可能还没加载完),推荐使用Selenium的显式等待来等待目标元素加载完成,这样能大幅提升稳定性:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 替换原来的time.sleep(1)和日期提取代码
wait = WebDriverWait(driver, 10)  # 最多等待10秒
date_element = wait.until(EC.presence_of_element_located(
    (By.CSS_SELECTOR, 'article header span.no-break-text.lite')
))
date = date_element.text
print(date)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:42:29