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

Python Selenium遍历可点击链接:返回列表页失败求助

解决Selenium循环点击职位列表后无法返回继续操作的问题

你遇到的核心问题是页面元素失效——当跳转到详情页再返回列表页时,之前通过driver.find_elements获取的looking_job列表里的元素已经变成"过时元素",因为页面重新加载后原DOM结构被刷新,旧的元素引用不再有效。

原代码的问题点

  • 初始获取的looking_job元素集合,在页面跳转返回后引用失效,循环中再操作会报错
  • 重复用find_element定位第count个元素,逻辑冗余且易受页面加载顺序影响
  • 过度依赖固定sleep,稳定性差

解决方案1:先收集所有职位链接,再逐个访问(推荐)

最稳妥的方式是先提取所有职位详情页的URL,存到列表后循环访问,无需在列表页和详情页间来回切换,从根源避免元素失效问题。

修改后的代码:

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
from selenium.webdriver.chrome.service import Service

driver_service = Service(executable_path="C:\Program Files (x86)\chromedriver.exe")
driver = webdriver.Chrome(service=driver_service)
driver.maximize_window()
wait = WebDriverWait(driver, 10)

# 打开职位列表页
driver.get('https://www.seek.com.au/data-jobs-in-information-communication-technology/in-All-Perth-WA')

# 等待列表加载完成,提取所有职位链接的href属性
job_links = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//a[@data-automation='jobTitle']")))
job_urls = [link.get_attribute('href') for link in job_links]

# 循环访问每个详情页并执行操作
for url in job_urls:
    driver.get(url)
    # 这里添加你需要在详情页执行的逻辑,比如提取职位信息
    try:
        job_title = wait.until(EC.presence_of_element_located((By.XPATH, "//h1[@data-automation='job-detail-title']"))).text
        print(job_title)
    except Exception as e:
        print(f"处理职位失败: {e}")

driver.quit()

解决方案2:每次返回列表页后重新定位元素

如果必须在列表页和详情页间切换,每次返回后都要重新获取职位元素列表,不能复用旧的元素引用。

修改后的代码:

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
from selenium.webdriver.chrome.service import Service
import time

driver_service = Service(executable_path="C:\Program Files (x86)\chromedriver.exe")
driver = webdriver.Chrome(service=driver_service)
driver.maximize_window()
wait = WebDriverWait(driver, 10)

base_url = 'https://www.seek.com.au/data-jobs-in-information-communication-technology/in-All-Perth-WA'
driver.get(base_url)

# 获取初始职位总数
job_count = len(wait.until(EC.presence_of_all_elements_located((By.XPATH, "//a[@data-automation='jobTitle']"))))

for i in range(job_count):
    # 返回列表页并重新定位所有职位元素
    driver.get(base_url)
    job_links = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//a[@data-automation='jobTitle']")))
    # 点击第i个职位(索引从0开始)
    job_links[i].click()
    
    # 执行详情页操作
    try:
        job_title = wait.until(EC.presence_of_element_located((By.XPATH, "//h1[@data-automation='job-detail-title']"))).text
        print(f"第{i+1}个职位: {job_title}")
    except Exception as e:
        print(f"第{i+1}个职位处理失败: {e}")
    
    time.sleep(1)  # 根据网站加载情况调整

driver.quit()

关键注意事项

  • 避免过时元素:页面跳转后,必须重新定位元素,不能复用之前的引用
  • 用显式等待替代sleep:WebDriverWait能等待元素加载完成后再操作,比固定sleep更稳定
  • 优先选择收集链接的方式:减少页面切换次数,运行效率更高,出错概率更低

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:26:06