如何使用 Selenium 批量提取网页中所有 H2 标签内的链接与文本内容 在网页自动化数据采集任务中,我们时常会遇到这样的场景:一批结构相似的标题元素,需要统一提取其中的链接与文本——比如巴西总统档案馆网站,每个演讲条目都被包裹在 中,内部嵌套 标签,既承载标题文字,又是 PDF 下载入口。 但
中,内部嵌套 标签,既承载标题文字,又是 PDF 下载入口。
但问题来了。如果还是沿用老办法——用 visibility_of_element_located() 这样的单元素等待条件去定位,那结果就是:你只拿到了第一个 .tileHeadline,页面里的多出来的数十个同类项,通通被漏掉。说到底,这不是代码写得对不对的问题,而是从一开始就选错了策略。
find_elements(),一次性拿下所有匹配节点。
在这个案例里,目标页面的 HTML 结构非常典型:
标题文本
这种情况下,最精准的选择器就是最常见的:"h2 a"——定位所有嵌套在 h2 下的 a 标签,既能绕开父元素文本提取不完整的问题,又不会被子元素干扰。
下面这段代码,就是针对这种场景优化后的生产级实现:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument("--disable-notifications")
options.add_experimental_option("excludeSwitches", ["enable-automation", "enable-logging"])
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 10)
try:
url = "http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/jose-sarney/discursos/1985b_start:int=0"
driver.get(url)
# 等待至少一个 h2 a 元素可见,确保 DOM 加载完整
wait.until(EC.visibility_of_element_located(("css selector", "h2 a")))
# 批量获取所有匹配的 a 标签
links = driver.find_elements("css selector", "h2 a")
speeches = []
for idx, link in enumerate(links, 1):
href = link.get_attribute("href") or "[无链接]"
text = link.text.strip() if link.text else "[无标题]"
speeches.append({
"index": idx,
"title": text,
"pdf_url": href
})
print(f"[{idx}] 标题: {text}")
print(f" PDF: {href}\n")
print(f" 共采集 {len(speeches)} 条总统演讲记录。")
finally:
driver.quit()
find_element 和 find_elements 的区别,这其实是最低级、也最容易出错的坑。前者只返回一个 WebElement,遇到多个匹配只会取第一个;后者返回的是 list[WebElement],是批量提取的唯一可靠方式。有时候不是不知道,而是写顺手了没注意,数据就从20条缩水成1条了。
二是别让努力白费在错误的元素上。这个例子里,h2 本身没有 href 属性,真实的链接藏在它的子元素 a 标签里。如果直接对 h2 调用 .get_attribute("href"),那必然是 None,毫无意义。
三是健壮性细节不能省。实际工程环境不可能像演示那么完美,所以要加上空值校验。例如:
href = link.get_attribute("href")
if not href:
href = link.get_attribute("data-href") or "[链接缺失]"
四是关于性能与反爬。这个站点的渲染并不复杂,但如果涉及翻页采集,建议复用同一个 driver 实例,配合 time.sleep(1) 或显式等待,既保证完成度,又避免因为高频请求被对方盯上。
最终,通过这种方法,你不仅能完整捕获页面上所有 H2 关联链接,还能轻松把数据输出为 JSON、CSV,或者直接写入数据库——从“能跑通”到“可交付”,这个跨越其实就差那么几个关键选择。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述