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

如何选择正确路径点击元素?网页链接循环点击实现求助

解决方案

你的核心问题是未实现循环逻辑,同时存在几处细节需要修正,以下是完整的解决方法:

可运行代码示例

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.common.exceptions import TimeoutException

driver = webdriver.Chrome()  # 可根据你的浏览器替换为Firefox/Edge等
driver.get("https://www.hatvp.fr/le-repertoire/liste-des-entites-enregistrees/")

def wait_for_element_to_be_clickable(css_selector):
    return WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, css_selector)))

i = 1
while True:
    try:
        # 用f-string拼接CSS选择器,更简洁易读
        element_selector = f"a.orga-card-row:nth-child({i})"
        # 等待元素可点击并获取元素
        target_element = wait_for_element_to_be_clickable(element_selector)
        target_element.click()
        
        # 此处可添加当前页面的处理逻辑,比如提取数据等
        
        # 返回列表页面,继续处理下一个链接
        driver.back()
        # 等待列表页重新加载完成,避免元素定位失败
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.orga-card-row")))
        i += 1
    except TimeoutException:
        # 找不到第i个元素时,说明所有链接已处理完毕
        print("所有链接处理完成")
        break

driver.quit()

关键修正说明

  • 补全循环逻辑:用while True配合异常捕获处理不确定数量的元素,找不到下一个元素时自动终止循环,比固定范围的for循环更灵活。
  • 替换过时API:find_element_by_css_selector是Selenium旧版本方法,当前推荐使用find_element(By.CSS_SELECTOR, 选择器)(已整合到等待方法中)。
  • 页面跳转处理:点击链接后必须调用driver.back()返回列表页,否则后续无法定位原页面元素;返回后需等待列表页重新加载完成,避免元素未就绪导致定位失败。
  • 选择器拼接优化:你的str(i)拼接方式本身可行,但用f-string(f"xxx{i}xxx")更简洁不易出错。
  • 异常终止循环:捕获TimeoutException判断是否处理完所有元素,避免无限循环或报错。

如果页面元素是一次性加载完成的,也可以先获取元素总数再用for循环:

# 先获取所有目标元素的数量
total_elements = len(driver.find_elements(By.CSS_SELECTOR, "a.orga-card-row"))

for i in range(1, total_elements + 1):
    element_selector = f"a.orga-card-row:nth-child({i})"
    target_element = wait_for_element_to_be_clickable(element_selector)
    target_element.click()
    
    # 处理页面逻辑
    driver.back()
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.orga-card-row")))

若页面是滚动加载内容,需先滚动到底部加载所有元素,再获取总数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:00:07