本文介绍如何利用 selenium 4.8 配合显式等待和 xpath 定位,从嵌套 html 列表(`
在 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。








