You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VBA抓取Yahoo Finance股票代码与名称遇阻,求解决方案

解决Yahoo Finance股票表格数据抓取的VBA问题

先拆解你遇到的两个核心问题

  1. 为什么用完整class字符串没返回结果?
    HTML里的class属性是多个类名用空格分隔的集合,而VBA的getElementsByClassName并不支持直接传入带空格的完整字符串——它会去寻找class属性完全等于这个字符串的元素,但实际上没有元素会这么定义class,所以自然返回空。

  2. 为什么用Va(t)会拿到大量无关元素?
    Va(t)是一个很通用的类,页面上很多元素都用到了它,不只是你目标表格的行,所以结果会包含很多非目标元素。


给你两种精准抓取的简便方法

首先要确保页面完全加载,这是最容易忽略的点,先把基础的IE初始化和等待代码写好:

Dim appIE As Object
Set appIE = CreateObject("InternetExplorer.Application")
appIE.Visible = True ' 调试时设为True,上线可改False后台运行
appIE.Navigate "https://uk.finance.yahoo.com/quote/MSFT?p=MSFT&.tsrc=fin-srch"

' 强制等待页面加载完成(ReadyState=4表示加载完成)
Do While appIE.Busy Or appIE.ReadyState <> 4
    DoEvents
Loop

方法一:用CSS选择器精准匹配目标行

你的目标行同时拥有Va(t)Fw(500)H(44px)这几个类,我们可以用CSS选择器把它们组合起来,直接定位到所有目标表格行:

Dim targetRows As Object
' CSS选择器语法:tr.类名1.类名2.类名3,匹配同时拥有这几个类的tr元素
Set targetRows = appIE.document.querySelectorAll("tr.Va(t).Fw(500).H(44px)")

Dim row As Object
Dim symbol As String, name As String

' 遍历每一行提取数据
For Each row In targetRows
    ' 股票代码在第一个td的a标签里
    symbol = row.querySelector("td:nth-child(1) a").innerText
    ' 股票名称在第二个td的文本中
    name = row.querySelector("td:nth-child(2)").innerText
    ' 输出到立即窗口
    Debug.Print "代码: " & symbol & " | 名称: " & name
Next row

方法二:先定位目标表格再遍历行

如果目标表格有更独特的父容器标识(比如页面里这个表格是在"Related Quotes"区块),可以先找到这个容器,再遍历里面的行,稳定性更高:

Dim relatedContainer As Object
' 找到包含目标表格的父容器(用data-test属性定位,这个标识通常不会轻易变)
Set relatedContainer = appIE.document.querySelector("div[data-test=""related-quotes""]")

If Not relatedContainer Is Nothing Then
    Dim targetTable As Object
    Set targetTable = relatedContainer.querySelector("table")
    
    Dim rows As Object
    Set rows = targetTable.getElementsByTagName("tr")
    
    ' 跳过表头行(从第2个tr开始,索引从0算)
    Dim i As Integer
    For i = 1 To rows.Length - 1
        symbol = rows(i).querySelector("td:nth-child(1) a").innerText
        name = rows(i).querySelector("td:nth-child(2)").innerText
        Debug.Print "代码: " & symbol & " | 名称: " & name
    Next i
Else
    Debug.Print "未找到目标表格"
End If

一些实用小提示

  • 用浏览器F12开发者工具检查元素时,可以右键元素选择「复制」→「复制选择器」,直接得到可用的CSS选择器,避免自己写错;
  • Yahoo Finance偶尔会有反爬机制,如果遇到元素找不到的情况,可以加一段延时(比如Application.Wait Now + TimeValue("00:00:03"))再抓取;
  • 如果页面结构更新,记得重新核对元素的选择器,避免抓取失败。

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

火山引擎 最新活动