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

Selenium通过XPath点击按钮失败求助(Investing.com页面)

解决Selenium点击Investing.com Annual按钮超时的问题

问题背景

爬取https://www.investing.com/equities/nvidia-corp-financial-summary页面时,已成功处理Cookie的Accept按钮,但切换到Annual数据的按钮(默认选中Quarterly)始终触发超时异常,即使修正annual_link()为annual_link.click()后问题仍存在。

问题原因分析

  • XPath定位不稳定:原使用的//*[@id="leftColumn"]/div[9]/a[1]依赖元素层级位置(div[9]),页面动态加载内容可能导致层级变化,定位失效。
  • 元素未完全可见:即使元素存在,若未滚动到视口内,Selenium的element_to_be_clickable条件可能不满足。
  • 等待时间不足:原等待时间仅3秒,页面动态加载可能需要更长时间。
  • 异常捕获错误:WebDriverWait超时抛出的是TimeoutException,而非NoSuchElementException,原代码捕获的异常类型不对,无法正确处理超时情况。

修复方案及代码调整

关键优化点

  1. 使用文本定位替代层级XPath,提升定位稳定性://a[text()='Annual'](或结合按钮类名//a[contains(@class, 'float_lang_base_1') and text()='Annual'],适配Investing.com按钮的通用类)
  2. 点击前强制滚动到元素所在位置,确保元素可见
  3. 延长等待时间至10秒,适配页面动态加载速度
  4. 修正异常捕获类型,处理TimeoutException
  5. 移除不必要的固定滚动距离,改为滚动到目标元素位置

修改后的完整代码

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import time

company = 'nvidia-corp'
driver = webdriver.Chrome()  # 需指定路径可传入executable_path参数
driver.get(f"https://www.investing.com/equities/{company}-financial-summary")

# 处理Cookie同意按钮
wait = WebDriverWait(driver, 10)
try:
    accept_link = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="onetrust-accept-btn-handler"]')))
    accept_link.click()
except TimeoutException:
    print("Cookie同意按钮未找到或超时")

# 关闭注册弹窗
try:
    close_popup_link = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="PromoteSignUpPopUp"]/div[2]/i')))
    close_popup_link.click()
except TimeoutException:
    print("注册弹窗未出现或无法关闭")

# 定位并点击Annual按钮
try:
    # 使用文本定位Annual按钮,更稳定
    annual_link = wait.until(EC.visibility_of_element_located((By.XPATH, '//a[text()="Annual"]')))
    # 滚动到元素位置
    driver.execute_script("arguments[0].scrollIntoView(true);", annual_link)
    time.sleep(1)  # 预留滚动后的缓冲时间
    annual_link.click()
    print("成功切换到Annual数据")
except TimeoutException:
    print("Annual按钮定位超时或无法点击")
except Exception as e:
    print(f"点击Annual按钮时出现错误: {str(e)}")

# 后续爬取逻辑...

# 关闭浏览器
driver.quit()

额外注意事项

  • 若网站有反爬机制,可适当增加随机等待时间,避免被检测
  • 建议使用webdriver-manager自动管理ChromeDriver版本,避免路径问题
  • 若仍无法定位,可打开浏览器开发者工具,确认Annual按钮的最新属性(如class、id),调整定位表达式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:57:39