使用MSXML2.ServerXMLHTTP的.responsetext无法获取目标网页数值求助
问题分析与解决思路
为什么responseText里找不到目标数值
这个网站是动态加载内容的:你用MSXML2.ServerXMLHTTP获取的是服务器返回的原始静态HTML,而浏览器里看到的970.15是页面加载后通过JavaScript动态渲染出来的,静态源码里根本没有这个数值,所以自然搜不到。
解决方案
方案1:用支持JS渲染的浏览器控件(VBA环境)
如果是在VBA里操作,可以用InternetExplorer对象模拟浏览器加载页面,等JS执行完成后再获取渲染后的HTML:
Sub GetDynamicValue() Dim ie As Object Dim targetValue As String Set ie = CreateObject("InternetExplorer.Application") ie.Visible = False ' 可设为True查看加载过程 ie.Navigate "https://www.spglobal.com/spdji/en/indices/equity/sp-euro-50-equal-weight-50-point-decrement-index/#overview" ' 等待页面加载完成 Do While ie.Busy Or ie.ReadyState <> 4 DoEvents Loop ' 替换为实际元素选择器(从浏览器检查工具中获取) targetValue = ie.Document.querySelector(".index-value").innerText MsgBox "获取到的数值:" & targetValue ie.Quit Set ie = Nothing End Sub
注意:需要右键浏览器里的目标数值→检查,确认元素的类名/ID,替换querySelector里的参数。
方案2:直接调用网站的API接口(更高效)
打开浏览器开发者工具(F12)→切换到「网络」面板,刷新页面后筛选「XHR」或「Fetch」请求,找返回指数数据的JSON接口(通常地址包含api、index等关键词)。找到后直接用MSXML2.ServerXMLHTTP请求该接口,就能拿到包含目标数值的结构化数据,无需处理复杂的HTML。
关于单元格需删除前50字符的问题
这大概率是responseText开头包含了UTF-8 BOM头或其他编码相关的不可见前缀。可以直接用VBA的Mid函数截取有效内容:
Dim rawText As String rawText = xmlHttp.responseText Dim cleanText As String cleanText = Mid(rawText, 51) ' 从第51位开始截取有效内容
也可以在请求时指定编码,避免前缀问题:
xmlHttp.setRequestHeader "Accept-Charset", "utf-8"
内容的提问来源于stack exchange,提问作者Gonzague Pernin
相关产品推荐
相关产品推荐

