讲师中心 微信公众号
AI工具推荐 视频效率加速

如何使用 Selenium 精准定位并下载动态切换 Tab 中的 CSV 文件

胖强酱_4213

胖强酱_4213

发布时间:2026-10-31 10:37:40

|

629人浏览过

|

来源于php中文网

原创

如何使用 Selenium 精准定位并下载动态切换 Tab 中的 CSV 文件

本文详解 selenium 在多 tab 页面中因 dom 共存导致元素定位失败的问题,通过限定作用域、优化 xpath 表达式及显式等待策略,稳定下载“index holdings”和“portfolio holdings”两个 tab 下的 csv 文件。

本文详解 selenium 在多 tab 页面中因 dom 共存导致元素定位失败的问题,通过限定作用域、优化 xpath 表达式及显式等待策略,稳定下载“index holdings”和“portfolio holdings”两个 tab 下的 csv 文件。

在使用 Selenium 自动化下载网页中的 CSV 文件时,一个常见但易被忽视的陷阱是:多个结构相同的 Tab 内容(如 Index Holdings 和 Portfolio Holdings)可能同时存在于 DOM 中,仅通过 display: none 切换可见性,而非动态加载或销毁节点。这意味着你写的通用 XPath(如 //span[contains(text(),'Download a Spreadsheet')]/following-sibling::button[contains(text(),'CSV File')])会匹配到多个按钮——通常返回 3 个元素(含页脚或其他冗余按钮),而 .element_to_be_clickable() 默认作用于第一个匹配项,该元素很可能属于已隐藏的 Tab,从而触发 TimeoutException。

根本解法不是“重试”或“加长等待”,而是将定位范围严格约束到当前活跃 Tab 对应的 DOM 子树中。根据页面结构分析,两个主 Tab 内容均包裹在 <div class="tab-content"> 下,且每个 <code><div role="tabpanel"> 对应一个 Tab 面板(共 4 个,前两个即为目标)。我们可先定位到目标 Tab 面板,再在其内部查找 CSV 按钮:<pre class="brush:php;toolbar:false;">from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = &quot;https://www.sectorspdrs.com/mainfund/XLC&quot; service = Service(executable_path=&quot;chromedriver.exe&quot;) driver = webdriver.Chrome(service=service) wait = WebDriverWait(driver, 15) driver.get(url) # Step 1: 下载 Index Holdings 的 CSV(定位到第 1 个 tabpanel) index_tab = wait.until( EC.presence_of_element_located((By.XPATH, &quot;(//div[@class='tab-content']/div[@role='tabpanel'])[1]&quot;)) ) csv_btn_index = wait.until( EC.element_to_be_clickable( (By.XPATH, &quot;.//span[contains(text(), 'Download a Spreadsheet')]/following-sibling::button[contains(., 'CSV File')]&quot;) ) ) csv_btn_index.click() # Step 2: 切换到 Portfolio Holdings Tab(显式点击导航链接) portfolio_tab_link = wait.until( EC.element_to_be_clickable((By.XPATH, &quot;//a[contains(text(), 'Portfolio Holdings')]&quot;)) ) portfolio_tab_link.click() # Step 3: 下载 Portfolio Holdings 的 CSV(定位到第 2 个 tabpanel) portfolio_tab = wait.until( EC.presence_of_element_located((By.XPATH, &quot;(//div[@class='tab-content']/div[@role='tabpanel'])[2]&quot;)) ) csv_btn_portfolio = wait.until( EC.element_to_be_clickable( (By.XPATH, &quot;.//span[contains(text(), 'Download a Spreadsheet')]/following-sibling::button[contains(., 'CSV File')]&quot;) ) ) csv_btn_portfolio.click()</pre><p>✅ 关键要点说明: </p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill9448" title="Knowledge Graph - Csv Graph Loader Generator"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20d3191a227.jpg" alt="Knowledge Graph - Csv Graph Loader Generator" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill9448" title="Knowledge Graph - Csv Graph Loader Generator">Knowledge Graph - Csv Graph Loader Generator</a> <p>从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。</p> </div> <a href="/xiazai/skill9448" title="Knowledge Graph - Csv Graph Loader Generator" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <ul> <li> <strong>使用 <code>(XPath)[n] 显式索引:(//div[@role='tabpanel'])[1] 确保获取首个面板(Index Holdings),[2] 获取第二个(Portfolio Holdings),避免歧义;

  • 相对 XPath(. 开头):在 portfolio_tab 元素上调用 .//...,使搜索范围严格限定在该面板内,彻底规避隐藏元素干扰;
  • presence_of_element_located + element_to_be_clickable 组合:先确保面板已加载(即使不可见),再等待其内部按钮可点击,兼顾稳定性与准确性;
  • 避免 ActionChains.move_to_element().click():现代 Selenium 中,直接调用 .click() 更可靠;若遇 ElementClickInterceptedException,可添加 driver.execute_script("arguments[0].click();", element) 作为兜底。
  • ⚠️ 注意事项:

    • ChromeDriver 版本需与本地 Chrome 浏览器严格匹配(如 Chrome 134 → ChromeDriver 134.0.6998.90),否则可能引发不可预知的交互异常;
    • 下载行为依赖浏览器默认设置,建议初始化 driver 时配置下载路径与自动保存策略(如通过 options.add_experimental_option("prefs", {...}));
    • 若页面存在反爬机制(如 Cloudflare),需额外处理 User-Agent、启用无头模式兼容性或集成 undetected-chromedriver2。

    通过约束作用域、精准索引与分步等待,即可稳健实现多 Tab 场景下的自动化 CSV 下载,无需依赖 JavaScript 注入或复杂轮询逻辑。

    热门AI工具

    更多
    立刻MV
    立刻MV Hot

    立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

    咔片AIPPT

    一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

    豆包大模型

    豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

    WorkBuddy

    一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

    DeepSeek

    DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

    PixTV
    PixTV Hot

    PixTV是一款面向AIGC内容创作的AI视频生成工具。

    AionClaw
    AionClaw Hot

    AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

    讯飞绘文

    讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

    音述AI
    音述AI Hot

    一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

    相关专题

    更多
    python打包成可执行文件
    python打包成可执行文件

    本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

    1831

    2023.07.20

    python能做什么
    python能做什么

    python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

    4944

    2023.07.25

    format在python中的用法
    format在python中的用法

    Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

    1789

    2023.07.31

    python教程
    python教程

    Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

    29597

    2023.08.03

    python环境变量的配置
    python环境变量的配置

    Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

    3527

    2023.08.04

    python eval
    python eval

    eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

    3547

    2023.08.04

    scratch和python区别
    scratch和python区别

    scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

    1223

    2023.08.11

    python合并两个列表
    python合并两个列表

    Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

    616

    2023.08.10

    Vite 项目如何打包和部署
    Vite 项目如何打包和部署

    Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

    60

    2026.10.28

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    相关下载

    更多

    精品课程

    更多
    热门推荐
    /
    最新课程

    最新文章

    更多

    PDF工具

    更多
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn