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

如何用Selenium Python点击无唯一标识的网页链接

问题说明

我尝试点击网页上的日期后,再点击该日期下的所有目标链接,但这些链接只有<a>标签,没有唯一类名,页面中还有大量其他无关的<a>元素。现有代码能成功点击日期,但无法定位并点击目标链接,原代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

PATH = "C:\Program Files (x86)\chromedriver.exe"  # path of chrome driver
driver = webdriver.Chrome(PATH)  # accesses the chrome driver

driver.get("https://www.eduqas.co.uk/qualifications/computer-science-as-a-level/#tab_pastpapers")  # website
driver.maximize_window()

driver.implicitly_wait(3)
driver.execute_script("window.scrollTo(0, 540)")
sleep(3)  # Giving time to fully load the content
elements = driver.find_elements(By.CSS_SELECTOR, ".css-13punl2")
driver.find_element(By.ID, 'accept-cookies').click()  # Closes the cookies prompt


for x in elements:
    if x.text == 'GCSE':
        continue
    x.click()
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # this scrolls the page to the bottom
    sleep(1)  # This sleep is necessary to give time to finish scrolling



print(len(elements))
解决方法

核心思路是点击日期后,仅在该日期对应的展开内容容器内查找目标链接,避免误操作页面其他无关的<a>标签。以下是优化后的代码及关键改进点:

优化后代码

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

# 路径用r前缀避免转义问题
PATH = r"C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://www.eduqas.co.uk/qualifications/computer-science-as-a-level/#tab_pastpapers")
driver.maximize_window()

# 显式等待处理cookie弹窗,确保可点击再操作
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'accept-cookies'))).click()

# 等待所有日期元素加载完成
date_elements = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".css-13punl2"))
)

for elem in date_elements:
    if elem.text == 'GCSE':
        continue
    # 点击展开当前日期的内容
    elem.click()
    # 定位当前日期对应的内容容器(通过XPath找兄弟节点)
    content_container = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, f"//div[@class='css-13punl2' and text()='{elem.text}']/following-sibling::div"))
    )
    # 获取容器内所有目标链接
    target_links = content_container.find_elements(By.TAG_NAME, 'a')
    for link in target_links:
        # 处理链接打开新窗口的情况:记录原窗口句柄
        original_window = driver.current_window_handle
        link.click()
        # 等待新窗口打开并切换到新窗口
        WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
        for window_handle in driver.window_handles:
            if window_handle != original_window:
                driver.switch_to.window(window_handle)
                break
        # 这里可添加对新页面的操作,比如关闭页面
        driver.close()
        # 切回原页面继续处理其他链接
        driver.switch_to.window(original_window)

# 关闭浏览器
driver.quit()

关键改进点

  • 精准定位目标区域:通过XPath定位当前日期元素的兄弟内容容器,只在该容器内查找<a>标签,彻底避免误点无关链接
  • 用显式等待替代sleep:显式等待能确保元素可交互后再操作,大幅提升代码稳定性,减少因页面加载慢导致的错误
  • 处理新窗口切换:目标链接会打开新窗口,添加了窗口切换逻辑,确保操作完成后切回原页面继续处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:50:34