VBA读取XMLHTTP请求响应DOM结构匹配异常问题咨询
解决VBA中XMLHTTP返回DOM与浏览器不一致的问题
哈哈,这个坑我之前踩过!你遇到的DOM结构不一致的情况,本质是浏览器自动修正HTML和MSHTML严格解析原始文本的差异导致的——浏览器开发者工具里看到的<a>是<aside>子元素,那是浏览器帮你修正了不规范的原始HTML(比如未闭合标签、错误嵌套);但XMLHTTP拿到的是服务器返回的原始HTML字符串,Microsoft HTML Library解析时会严格按原始文本构建DOM,不会做自动修正,所以实际<a>和<aside>是同级关系。
修正后的代码实现
既然已经验证了同级定位的逻辑可行,我给你调整了代码,用更稳定的方式获取目标<a>标签的title属性(也就是博彩商名称):
Sub SendRequest() Dim XMLHTTP As Object Dim htmlDoc As MSHTML.HTMLDocument Dim targetLink As MSHTML.HTMLAnchorElement ' 初始化XMLHTTP请求 Set XMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0") XMLHTTP.Open "GET", "替换为你的目标URL", False XMLHTTP.send ' 加载原始HTML到MSHTML文档对象 Set htmlDoc = New MSHTML.HTMLDocument htmlDoc.body.innerHTML = XMLHTTP.responseText ' 方法1:用CSS选择器直接定位aside的同级a标签(推荐,更简洁) Set targetLink = htmlDoc.querySelector("aside + a") ' 匹配紧跟在aside后的第一个a标签 If Not targetLink Is Nothing Then Debug.Print "博彩商名称:" & targetLink.title Else Debug.Print "未找到目标链接" End If ' 方法2:手动遍历同级节点(应对复杂空白文本节点的情况) ' Dim asideElem As MSHTML.HTMLElement ' Set asideElem = htmlDoc.querySelector("aside") ' If Not asideElem Is Nothing Then ' Set targetLink = asideElem.nextSibling ' ' 跳过空白文本节点,找到真正的a标签 ' Do While Not targetLink Is Nothing And targetLink.tagName <> "A" ' Set targetLink = targetLink.nextSibling ' Loop ' If Not targetLink Is Nothing Then ' Debug.Print "博彩商名称:" & targetLink.title ' End If ' End If ' 清理对象 Set targetLink = Nothing Set htmlDoc = Nothing Set XMLHTTP = Nothing End Sub
实用小技巧
你可以把XMLHTTP.responseText输出到一个文本文件里(比如执行Open "C:\temp\raw_html.txt" For Output As #1: Print #1, XMLHTTP.responseText: Close #1),查看服务器返回的原始HTML结构,这样就能直观看到<a>和<aside>的真实关系,再也不会被浏览器修正后的DOM误导啦!
内容的提问来源于stack exchange,提问作者Ryszard Jędraszyk
相关产品推荐
相关产品推荐

