如何使用 Selenium(Python)精准提取网页中特定结构的链接

本文介绍如何利用 selenium 4.8 配合显式等待和 xpath 定位,从嵌套 html 列表(`

  • `)中批量提取目标 `` 标签的 `href` 属性,生成可迭代的 url 列表。

    在 Web 自动化与数据采集场景中,精准定位并提取结构化链接是常见需求。当目标链接深嵌于多层容器(如

  • → →

    → )且页面存在动态加载时,直接使用 find_elements() 易因元素未就绪而失败。此时应结合 显式等待(WebDriverWait)高精度 XPath 表达式,确保稳定获取。

    以下为完整、健壮的实现方案:

    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.options import Options
    
    # 初始化 WebDriver(以 Chrome 为例)
    chrome_options = Options()
    chrome_options.add_argument("--headless")  # 无头模式,可选
    driver = webdriver.Chrome(options=chrome_options)
    
    try:
        driver.get("https://example.com")  # 替换为目标网址
    
        # 显式等待:最多等待 25 秒,直到所有匹配的  元素出现在 DOM 中
        wait = WebDriverWait(driver, 25)
        link_elements = wait.until(
            EC.presence_of_all_elements_located(
                (By.XPATH, '//li//h4[@class="programme titles"]/a[@class="br-blocklink__link"]')
            )
        )
    
        # 提取所有 href 属性,过滤掉 None 值(避免空链接)
        href_list = [elem.get_attribute("href") for elem in link_elements if elem.get_attribute("href")]
    
        print(f"成功提取 {len(href_list)} 个有效链接:")
        for i, url in enumerate(href_list, 1):
            print(f"{i}. {url}")
    
        # 后续可遍历处理每个链接,例如:
        # for url in href_list:
        #     driver.get(url)
        #     # ... 解析详情页内容
    
    finally:
        driver.quit()  # 确保资源释放

    关键要点说明:

    • XPath 精准性://li//h4[@class="programme titles"]/a[@class="br-blocklink__link"] 使用 // 跳过中间层级,@class 精确匹配,避免因多余空格或动态类名(如 xxx)导致误匹配;若 class 含多个值(如 "programme titles active"),建议改用 contains(@class, 'programme titles')。
    • 显式等待优于隐式等待:presence_of_all_elements_located 确保元素已加载进 DOM(不保证可见或可点击),适合链接提取;如需交互,可换用 element_to_be_clickable。
    • 健壮性增强:添加 if elem.get_attribute("href") 过滤空值,防止后续操作报错。
    • 资源管理:务必在 finally 块中调用 driver.quit(),避免浏览器进程残留。

    ⚠️ 注意:Selenium 不适用于大规模静态爬取(推荐 Requests + BeautifulSoup);若目标网站反爬严格,请配合 User-Agent 轮换、合理延时及遵守 robots.txt。