Python Selenium操作NSE印度官网下载CSV时触发TimeoutException的原因及解决咨询
Python Selenium操作NSE印度官网下载CSV时触发TimeoutException的原因及解决咨询
嘿,我瞅了你这段自动化代码,碰到的TimeoutException问题其实很好理解——咱们来一步步捋清楚问题出在哪,再给你修正后的方案:
问题根源分析
你代码里的核心问题有三个:
- 完全没切换到SME标签页:NSE官网默认显示的是Equity板块的公告,你要的SME板块是另一个独立标签,直接找下载按钮自然找不到,因为目标元素根本不在当前视图里
- 元素定位错误:你用的XPATH是找包含
CFanncEquity-download的文本,这是Equity板块的下载按钮标识;SME板块的按钮文本是CFanncSME-download,定位错了元素肯定触发超时 - 硬等待不可靠:用
time.sleep()来等待页面加载太死板,网络波动或者页面渲染慢的时候,固定的等待时间根本不够,不如用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 import time driver=webdriver.Chrome() try: # Open the NSE announcements page driver.get("https://www.nseindia.com/companies-listing/corporate-filings-announcements") time.sleep(10) # Wait for the page to load and display the download button WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//a[contains(text(), 'CFanncEquity-download')]")) ) time.sleep(5) # Click on the download button for CSV download_button = driver.find_element(By.XPATH, "//a[contains(text(), 'CFanncEquity-download')]") download_button.click() # Wait for a few seconds to ensure download completes time.sleep(15) finally: # Close the browser driver.quit()
报错信息
Traceback (most recent call last): File "F:\automation\test.py", line 14, in <module> WebDriverWait(driver, 10).until( File "F:\environ\env_data\Lib\site-packages\selenium\webdriver\support\wait.py", line 105, in until raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: Stacktrace: GetHandleVerifier [0x00007FF609F080D5+2992373] (No symbol) [0x00007FF609B9BFD0] (No symbol) [0x00007FF609A3590A] (No symbol) [0x00007FF609A8926E] (No symbol) [0x00007FF609A8955C] (No symbol) [0x00007FF609AD27D7] (No symbol) [0x00007FF609AAF3AF] (No symbol) [0x00007FF609ACF584] (No symbol) [0x00007FF609AAF113] (No symbol) [0x00007FF609A7A918] (No symbol) [0x00007FF609A7BA81] GetHandleVerifier [0x00007FF609F66A2D+3379789] GetHandleVerifier [0x00007FF609F7C32D+3468109] GetHandleVerifier [0x00007FF609F70043+3418211] GetHandleVerifier [0x00007FF609CFC78B+847787] (No symbol) [0x00007FF609BA757F] (No symbol) [0x00007FF609BA2FC4] (No symbol) [0x00007FF609BA315D] (No symbol) [0x00007FF609B92979] BaseThreadInitThunk [0x00007FFC22E6259D+29] RtlUserThreadStart [0x00007FFC24D6AF38+40]
修正后的代码方案
下面是调整后的代码,我把每一步都加了注释,确保能正确切换到SME板块、选择1周时间范围,再下载CSV:
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 time driver = webdriver.Chrome() try: # 打开目标页面 driver.get("https://www.nseindia.com/companies-listing/corporate-filings-announcements") # 最大化窗口,避免元素被遮挡 driver.maximize_window() # 1. 等待SME标签加载完成并点击 sme_tab = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "//a[text()='SME']")) ) sme_tab.click() print("已切换到SME标签页") # 2. 等待1W时间选项加载完成并点击 one_week_option = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "//button[text()='1W']")) ) one_week_option.click() print("已选择1周时间范围") # 3. 等待SME板块的CSV下载按钮可点击并点击 download_button = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'CFanncSME-download')]")) ) download_button.click() print("已触发CSV下载") # 等待下载完成(根据自己的网络情况调整时间) time.sleep(10) finally: # 关闭浏览器 driver.quit()
额外提示
- 建议给浏览器设置固定下载路径,避免每次弹出保存对话框(可以查ChromeOptions的
add_experimental_option方法实现) - 如果还是碰到元素找不到的情况,可能是页面有iframe或者动态加载的内容,这时候需要先切换到对应的iframe再操作
- 尽量用
element_to_be_clickable代替presence_of_element_located,确保元素不仅存在还能正常交互
备注:内容来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

