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

使用VBA XMLHTTP(非IE)抓取纳斯达克网站表格返回空值问题求助

问题原因

返回值为空是因为纳斯达克目标页面的收益表格是JavaScript动态渲染的内容,你直接用XMLHTTP请求拿到的是未执行JS的初始HTML源码,里面不存在.earnings-surprise__table对应的DOM节点,所以选择器返回空值。

修复方案

直接请求页面背后的官方数据接口即可,不需要解析HTML,数据更稳定也更容易处理。你需要在请求时补充请求头避免被接口拦截,修改后的代码如下:

Public Sub GetTableMayank()
    Dim ws As Worksheet, jsonResp As Object, earningsData As Object
    Dim r As Long, c As Long, item As Object
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    r = 1
    ' 写入表头
    ws.Cells(r, 1) = "财报日期"
    ws.Cells(r, 2) = "每股收益预期"
    ws.Cells(r, 3) = "实际每股收益"
    ws.Cells(r, 4) = "超预期百分比"
    r = r + 1
    
    With CreateObject("MSXML2.XMLHTTP.6.0")
        ' 直接请求官方数据接口,替换URL中的股票代码即可适配其他股票
        .Open "GET", "https://api.nasdaq.com/api/company/ctxs/earnings-surprise", False
        ' 补充请求头避免403拦截
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
        .setRequestHeader "Accept", "application/json"
        .send
        
        If .Status = 200 Then
            ' 解析JSON返回结果,需要提前引入VBA-JSON库
            Set jsonResp = JsonConverter.ParseJson(.responseText)
            Set earningsData = jsonResp("data")("earningsSurpriseTable")("rows")
            
            For Each item In earningsData
                ws.Cells(r, 1) = item("date")
                ws.Cells(r, 2) = item("consensusEstimate")
                ws.Cells(r, 3) = item("actualEarnings")
                ws.Cells(r, 4) = item("surprisePercentage")
                r = r + 1
            Next
        End If
    End With
End Sub

补充说明

  • 如果不想引入VBA-JSON解析库,也可以用正则表达式匹配返回的JSON字符串中的对应字段提取数据。
  • 如果必须要解析渲染后的HTML,可以使用Selenium调用Chrome/Edge无头浏览器实现,不需要依赖IE,兼容性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 20:36:02