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

如何使用Selenium抓取Java渲染页面中的PDF文件?

解决PDF链接抓取问题的修正方案

原代码问题分析

  • 第一段代码使用driver.find_element()(单数方法),仅能返回单个元素,无法遍历;且固定time.sleep()的等待方式不可靠,可能元素还未加载完成就执行后续操作
  • 第二段代码存在语法错误:driver.find_element_by()是旧版Selenium API,新版应使用driver.find_element(),且参数传递格式不正确

修正后的代码方案

方案1:通过部分链接文本匹配+显式等待

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
import requests

# 初始化浏览器驱动
driver = webdriver.Chrome()
website_url = "https://hpvchemicals.oecd.org/UI/SIDS_Details.aspx?id=1034897e-e7bb-4603-900a-9f3208a8354b"
driver.get(website_url)

# 显式等待元素加载,最长等待10秒
wait = WebDriverWait(driver, 10)
# 匹配所有含目标文本的链接(用PARTIAL_LINK_TEXT避免完全匹配的限制)
elements = wait.until(EC.presence_of_all_elements_located((By.PARTIAL_LINK_TEXT, "OECD Agreed Conclusions")))

# 提取有效PDF链接
pdf_links = [elem.get_attribute('href') for elem in elements if ".pdf" in elem.get_attribute('href')]

# 批量下载PDF
for idx, link in enumerate(pdf_links):
    response = requests.get(link)
    with open(f"OECD_Conclusions_{idx+1}.pdf", "wb") as f:
        f.write(response.content)
    print(f"已完成第{idx+1}个PDF下载")

driver.quit()

方案2:直接通过XPath匹配所有PDF链接

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
import requests

driver = webdriver.Chrome()
website_url = "https://hpvchemicals.oecd.org/UI/SIDS_Details.aspx?id=1034897e-e7bb-4603-900a-9f3208a8354b"
driver.get(website_url)

wait = WebDriverWait(driver, 10)
# 匹配所有href属性包含.pdf的a标签
pdf_elements = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//a[contains(@href, ".pdf")]')))

pdf_links = [elem.get_attribute('href') for elem in pdf_elements]

# 批量下载PDF
for idx, link in enumerate(pdf_links):
    response = requests.get(link)
    with open(f"PDF_{idx+1}.pdf", "wb") as f:
        f.write(response.content)
    print(f"已完成第{idx+1}个PDF下载")

driver.quit()

关键修正点

  • 用显式等待替代固定sleep(),确保元素加载完成后再执行操作,比固定等待更稳定
  • 使用find_elements()(复数方法)替代find_element(),获取所有符合条件的元素
  • 修正API调用和XPath写法,适配新版Selenium语法
  • 新增PDF下载逻辑,直接通过requests库保存文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:33:19