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

胖强酱_4213

胖强酱_4213

2026-10-31

629人浏览

原创

如何使用 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 内容均包裹在

下,且每个
对应一个 Tab 面板(共 4 个,前两个即为目标)。我们可先定位到目标 Tab 面板,再在其内部查找 CSV 按钮:
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 = "https://www.sectorspdrs.com/mainfund/XLC"
service = Service(executable_path="chromedriver.exe")
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, "(//div[@class='tab-content']/div[@role='tabpanel'])[1]"))
)
csv_btn_index = wait.until(
    EC.element_to_be_clickable(
        (By.XPATH, ".//span[contains(text(), 'Download a Spreadsheet')]/following-sibling::button[contains(., 'CSV File')]") 
    )
)
csv_btn_index.click()

# Step 2: 切换到 Portfolio Holdings Tab(显式点击导航链接)
portfolio_tab_link = wait.until(
    EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Portfolio Holdings')]"))
)
portfolio_tab_link.click()

# Step 3: 下载 Portfolio Holdings 的 CSV(定位到第 2 个 tabpanel)
portfolio_tab = wait.until(
    EC.presence_of_element_located((By.XPATH, "(//div[@class='tab-content']/div[@role='tabpanel'])[2]"))
)
csv_btn_portfolio = wait.until(
    EC.element_to_be_clickable(
        (By.XPATH, ".//span[contains(text(), 'Download a Spreadsheet')]/following-sibling::button[contains(., 'CSV File')]") 
    )
)
csv_btn_portfolio.click()

✅ 关键要点说明:

  • 使用 (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) 作为兜底。

⚠️ 注意事项:

Knowledge Graph - Csv Graph Loader Generator
Knowledge Graph - Csv Graph Loader Generator

从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。

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

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

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

csv

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.07.20

1831

4

python能做什么
python能做什么

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

2023.07.25

4944

7

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

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

2023.07.31

1789

3

python教程
python教程

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

2023.08.03

29577

23

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

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

2023.08.04

3527

5

python eval
python eval

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

2023.08.04

3547

5

scratch和python区别
scratch和python区别

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

2023.08.11

1223

5

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

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

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2743

5

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习