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,原代码捕获的异常类型不对,无法正确处理超时情况。
修复方案及代码调整
关键优化点
- 使用文本定位替代层级XPath,提升定位稳定性:
//a[text()='Annual'](或结合按钮类名//a[contains(@class, 'float_lang_base_1') and text()='Annual'],适配Investing.com按钮的通用类) - 点击前强制滚动到元素所在位置,确保元素可见
- 延长等待时间至10秒,适配页面动态加载速度
- 修正异常捕获类型,处理
TimeoutException - 移除不必要的固定滚动距离,改为滚动到目标元素位置
修改后的完整代码
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
相关产品推荐
相关产品推荐

