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

Python Selenium操作NSE印度官网下载CSV时触发TimeoutException的原因及解决咨询

Python Selenium操作NSE印度官网下载CSV时触发TimeoutException的原因及解决咨询

嘿,我瞅了你这段自动化代码,碰到的TimeoutException问题其实很好理解——咱们来一步步捋清楚问题出在哪,再给你修正后的方案:

问题根源分析

你代码里的核心问题有三个:

  1. 完全没切换到SME标签页:NSE官网默认显示的是Equity板块的公告,你要的SME板块是另一个独立标签,直接找下载按钮自然找不到,因为目标元素根本不在当前视图里
  2. 元素定位错误:你用的XPATH是找包含CFanncEquity-download的文本,这是Equity板块的下载按钮标识;SME板块的按钮文本是CFanncSME-download,定位错了元素肯定触发超时
  3. 硬等待不可靠:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:19:31