Python Selenium遇StaleElementReferenceException,WebDriverWait无效求助
解决爬取elempleo网站时的StaleElementReferenceException异常
爬取https://www.elempleo.com/co/ofertas-empleo/55-6-millones?时,首次循环正常,第二次运行触发StaleElementReferenceException,尝试隐式等待和等待下一页按钮可点击均无效。
异常原因
StaleElementReferenceException的本质是元素引用失效:你在页面初始加载时获取了empleos元素,点击下一页后页面会重新渲染,旧的DOM结构被替换,之前保存的empleos引用已经指向不存在的元素,再次访问就会报错。
之前的等待策略只针对下一页按钮,但没有等待新的结果列表加载完成,也没有重新获取元素引用,所以问题无法解决。
修复方案
核心思路:每次页面更新后(比如点击下一页),重新获取目标元素,并等待新页面的内容完全加载。
修改后的代码示例:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC website = 'https://www.elempleo.com/co/ofertas-empleo/55-6-millones?' driver = webdriver.Chrome(path) driver.get(website) data = [] i = 0 # 处理第一页数据,等待结果列表加载完成 first_page_results = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'div.result-list.js-result-list.js-results-container')) ) data.append(first_page_results.text.splitlines()) while i < 4: # 滚动到底部,确保下一页按钮可见 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待下一页按钮可点击并点击 next_btn = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'a.js-btn-next')) ) next_btn.click() # 等待新页面的结果列表加载完成(关键:等待新元素出现,而非复用旧引用) new_results = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'div.result-list.js-result-list.js-results-container')) ) # 收集新页面数据 data.append(new_results.text.splitlines()) i += 1 driver.quit()
关键优化点
- 每次跳转后重新获取元素:不再复用初始的
empleos引用,每次点击下一页后,等待新的结果列表加载完成再获取新的元素引用。 - 精准等待目标内容:点击下一页后,等待新的结果列表元素出现,确保页面内容已经完全更新,而非只等待下一页按钮可点击。
- 修正数据收集逻辑:避免初始赋值覆盖列表,统一用
append收集每一页的数据。
额外建议
- 优先使用CSS选择器或XPath定位元素,比标签名定位更精准,减少无关元素匹配。
- 若网站存在反爬机制,可适当增加随机等待时间(如
time.sleep(1)),但优先依赖显式等待而非固定时长等待。
内容的提问来源于stack exchange,提问作者Miguel Espinosa Sierra
相关产品推荐
相关产品推荐

