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

使用VBA的HTML对象无法捕获网页内容问题求助

问题原因及解决方案

为什么获取不到表格元素?

  • 目标页面的股息表格是JavaScript动态渲染生成的,你用MSXML2.XMLHTTP获取的是服务器返回的原始HTML源码,里面并没有dividends-recent这个类的元素,自然会返回空对象。
  • 另外,Morningstar可能会拦截非浏览器发起的请求,你的请求没有携带浏览器标识(User-Agent),也可能导致返回内容不完整。

解决方案1:用IE浏览器模拟加载(VBA原生支持)

IE会自动执行页面的JavaScript,渲染出完整的动态内容。示例代码如下:

Dim ie As Object
Dim elem As Object
Dim url As String

url = "https://www.morningstar.com/stocks/xtks/1407/dividends"

Set ie = CreateObject("InternetExplorer.Application")
With ie
    .Visible = True ' 可设为False隐藏浏览器
    .Navigate url
    ' 等待页面完全加载
    Do While .Busy Or .ReadyState <> 4
        DoEvents
    Loop
    ' 获取目标元素
    Set elem = .Document.getElementsByClassName("dividends-recent")
    ' 后续处理elem中的表格内容...
    
    .Quit ' 关闭浏览器
End With
Set ie = Nothing

解决方案2:用Selenium Basic(推荐,支持Chrome/Firefox)

Selenium是更现代的网页自动化工具,需先完成前置安装:

  1. 安装Selenium Basic
  2. 下载对应浏览器的驱动(如ChromeDriver,需与浏览器版本匹配),放到系统路径或VBA工程目录

示例代码(Chrome):

Dim driver As New ChromeDriver
Dim elem As Object
Dim url As String

url = "https://www.morningstar.com/stocks/xtks/1407/dividends"

With driver
    .Start "Chrome"
    .Get url
    ' 等待元素加载(显式等待更可靠)
    .Wait 5000 ' 等待5秒,或用ExpectedConditions判断元素是否存在
    Set elem = .FindElementsByClass("dividends-recent")(0)
    ' 后续处理表格内容...
    
    .Quit
End With
Set driver = Nothing

额外提示

如果坚持用MSXML2.XMLHTTP,可以尝试添加浏览器请求头,但大概率仍拿不到动态生成的内容(JS渲染内容不会出现在原始响应里),示例代码:

With HTTP
    .Open "GET", url, False ' 改为同步请求更简单
    .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"
    .Send
End With

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:15:40