首页 > 编程语言 >Selenium批量提取H2标签内链接与文本内容

Selenium批量提取H2标签内链接与文本内容

来源:互联网 2026-06-30 08:11:06

如何使用 Selenium 批量提取网页中所有 H2 标签内的链接与文本内容 在网页自动化数据采集任务中,我们时常会遇到这样的场景:一批结构相似的标题元素,需要统一提取其中的链接与文本——比如巴西总统档案馆网站,每个演讲条目都被包裹在 中,内部嵌套 标签,既承载标题文字,又是 PDF 下载入口。 但

如何使用 Selenium 批量提取网页中所有 H2 标签内的链接与文本内容

在网页自动化数据采集任务中,我们时常会遇到这样的场景:一批结构相似的标题元素,需要统一提取其中的链接与文本——比如巴西总统档案馆网站,每个演讲条目都被包裹在

中,内部嵌套 标签,既承载标题文字,又是 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_elementfind_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,或者直接写入数据库——从“能跑通”到“可交付”,这个跨越其实就差那么几个关键选择。

Selenium批量提取H2标签内链接与文本内容

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

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。