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

使用Selenium+XPath爬取Morningstar.com数据遇问题求排查

解决Selenium爬取Morningstar ETF/共同基金数据失败的问题

我帮你分析下代码跑不通的几个常见原因,结合你的情况来看大概率是这些点:

1. 页面动态加载导致元素未及时渲染

Morningstar的页面是动态渲染的,你的代码在打开页面后立刻就去查找元素,这时候浏览器可能还没加载完目标元素,自然拿不到数据。这是动态页面爬取里最常见的坑。

2. 元素定位方法的小疏漏

你用了find_elements_by_xpath(复数形式),它返回的是匹配到的元素列表,就算找到元素也只会打印列表对象,而不是你要的实际数据。如果目标元素是唯一的,应该用单数的find_element_by_xpath,再获取它的文本或者属性值。

修复后的代码示例

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

driver = webdriver.Chrome()
link = "https://www.morningstar.com/etfs/bats/maga/quote.html"
driver.get(link)

try:
    # 等待NAV元素加载完成,最多等10秒
    tna_element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, '//td[@class="gr_table_colm2b"]//span[@id="NAV"]'))
    )
    print("TNA值:", tna_element.text)

    # 等待货币元素加载完成
    currency_element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, '//span[@class="gr_text3" and @id="navCurrency"]'))
    )
    print("货币:", currency_element.text)
finally:
    driver.close()

额外需要排查的点

  • 如果还是拿不到元素,检查页面是否存在iframe:打开浏览器开发者工具,看看目标元素是不是嵌套在某个iframe里,如果是,需要先切换到对应的iframe再执行元素查找。
  • 留意页面反爬机制:比如是否需要登录验证,或者有Cloudflare之类的人机验证步骤,不过从你能正常启动Chrome打开页面来看,这个可能性相对较低,但也可以确认下页面加载时有没有弹出验证窗口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:51:59