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

Tosca中带分页表格遍历与PDF批量下载自动化问题咨询

批量下载分页表格PDF的自动化实现方案

核心流程

  • 循环遍历表格每一页
  • 逐行点击当前页的「View」按钮,跳转详情页完成PDF下载
  • 返回列表页,切换至下一页重复操作,直至所有页处理完毕

具体实现步骤

1. 分页循环逻辑

先确定表格的总页数(如果页面有明确显示,比如「第X页/共Y页」,直接提取总页数);如果没有总页数,就通过「下一页」按钮的状态判断是否还有后续页面。

以Selenium为例的代码示例:

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

# 初始化驱动
driver = webdriver.Chrome()
driver.get("你的表格页面URL")

# 方式1:从页面提取总页数
total_pages = int(driver.find_element(By.CSS_SELECTOR, ".total-page-text").text.split("/")[-1].strip())
current_page = 1

while current_page <= total_pages:
    # 处理当前页所有行
    process_current_page(driver)
    # 切换下一页(非最后一页时)
    if current_page < total_pages:
        next_btn = driver.find_element(By.CSS_SELECTOR, ".next-page-btn")
        next_btn.click()
        # 等待页面刷新完成(等待表格元素失效,确保新页加载)
        WebDriverWait(driver, 10).until(
            EC.staleness_of(driver.find_element(By.CSS_SELECTOR, ".table-row"))
        )
    current_page += 1

# 方式2:通过下一页按钮是否可用判断(无总页数时)
# next_btn = driver.find_element(By.CSS_SELECTOR, ".next-page-btn")
# while next_btn.is_enabled():
#     process_current_page(driver)
#     next_btn.click()
#     WebDriverWait(driver, 10).until(EC.staleness_of(driver.find_element(By.CSS_SELECTOR, ".table-row")))
#     next_btn = driver.find_element(By.CSS_SELECTOR, ".next-page-btn")

2. 单页行遍历与PDF下载

每次处理新页面时,必须重新定位所有「View」按钮(页面刷新后旧元素会失效);点击按钮后处理详情页下载,再返回列表页。

def process_current_page(driver):
    # 获取当前页所有「View」按钮数量
    row_count = len(driver.find_elements(By.CSS_SELECTOR, ".table-row .view-btn"))
    
    for i in range(row_count):
        # 重新定位当前行的「View」按钮,避免Stale Element错误
        view_btn = driver.find_elements(By.CSS_SELECTOR, ".table-row .view-btn")[i]
        view_btn.click()
        
        # 调用你已实现的PDF下载模块
        download_pdf(driver)
        
        # 返回列表页:分两种情况处理
        if len(driver.window_handles) > 1:
            # 详情页在新窗口打开:关闭新窗口,切回原列表页
            driver.switch_to.window(driver.window_handles[-1])
            driver.close()
            driver.switch_to.window(driver.window_handles[0])
        else:
            # 详情页在当前窗口跳转:点击返回按钮或执行浏览器后退
            driver.back()
            # 等待列表页重新加载完成
            WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, ".table-row"))
            )

def download_pdf(driver):
    # 这里放入你已开发的PDF下载逻辑
    download_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, ".download-pdf-btn"))
    )
    download_btn.click()
    # 可选:等待PDF下载完成(可检查下载目录文件是否存在/大小稳定)

3. 常见问题处理

  • Stale Element 错误:分页切换或页面跳转后,之前定位的元素会失效,每次循环必须重新获取元素
  • PDF下载等待:避免未完成下载就跳转,可通过监听下载目录的文件状态(如文件大小不再变化)判断完成
  • 分页按钮失效判断:如果页面用disabled属性禁用下一页按钮,可通过next_btn.get_attribute("disabled")判断是否停止循环

优化建议

  • 优先使用显式等待(WebDriverWait)替代硬等待(time.sleep()),提升脚本稳定性
  • 如果表格数据量极大,可先爬取所有页的详情页链接,再批量打开下载,减少页面切换的耗时
  • 配置自动化工具的默认下载目录,避免文件重名覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:05:10