VBA不';t读取XMLHTTP请求';根据其树形结构的响应

VBA不';t读取XMLHTTP请求';根据其树形结构的响应,vba,xmlhttprequest,Vba,Xmlhttprequest,我已经检查了浏览器生成的页面和VBA XMLHTTP请求的字符串响应是否具有相同的树结构,a标记是的子项 不幸的是,当我想返回博彩公司名称(即a的title属性)时,我在访问旁边的第一个子公司时出错。结果表明,我需要使用代码,假设a标记是aside的兄弟,以使其工作: 必需参考:Microsoft HTML库 Sub SendRequest() Dim XMLHTTP As Object: Set XMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0") Di

我已经检查了浏览器生成的页面和VBA XMLHTTP请求的字符串响应是否具有相同的树结构,a标记是的子项

不幸的是,当我想返回博彩公司名称(即a的title属性)时,我在访问旁边的第一个子公司时出错。结果表明,我需要使用代码,假设a标记是aside的兄弟,以使其工作:

必需参考:Microsoft HTML库

Sub SendRequest()

Dim XMLHTTP As Object: Set XMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0")
Dim htmlEle1 As IHTMLElement
Dim htmlDoc As New HTMLDocument   
Dim urlName As String

urlName = "https://www.oddschecker.com/golf/the-masters/2018-us-masters/winner"

With XMLHTTP

    .Open "GET", urlName, False
    .send
    htmlDoc.body.innerHTML = .responseText

    For Each htmlEle1 In htmlDoc.getElementsByClassName("eventTableHeader")(0).Children
        If InStr(htmlEle1.className, "bookie-area") <> 0 Then
           Debug.Print htmlEle1.Children(1).getAttribute("title")
        End If
    Next htmlEle1

End With

End Sub
Sub SendRequest()
Dim XMLHTTP作为对象:设置XMLHTTP=CreateObject(“MSXML2.XMLHTTP.6.0”)
作为IHTMLElement的Dim HTMLLEE1
Dim htmlDoc作为新HTMLDocument
将URL名称设置为字符串
URL名称=”https://www.oddschecker.com/golf/the-masters/2018-us-masters/winner"
使用XMLHTTP
.Open“GET”,urlName,False
.发送
htmlDoc.body.innerHTML=.responseText
对于htmlDoc.getElementsByClassName(“eventTableHeader”)(0)中的每个htmle1
如果InStr(htmlEle1.className,“赌注区域”)为0,则
Debug.Print htmlEle1.Children(1.getAttribute)(“title”)
如果结束
下一个HTMLE1
以
端接头

这种行为与以下事实有关吗?

除了
是HTML5元素,VBA认为它是一个半结束标记?

所以这花了很多时间来弄清楚。问题是你不能这样做。启动新的
HTMLDocument
时,其
documentMode
默认设置为
5

因此,当我们加载一个文件并在其中写入任何HTML时,它不知道这些HTML5标记,它只做自己的更正。这和你在IE6浏览器中运行HTML5网站一样好。不幸的是,我无法找到哪种方式可以让我们以更高的documentMode创建/解析文档

更新

感谢@FlorentB指出仿真模式也适用于MSHTML库。我已经从下面意识到了这一点

但我认为它不适用于MSHTML库。我现在已经通过运行下面的命令来测试它

REG ADD "HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION" /v excel.exe /t REG_DWORD /d 11001 /f
然后是现有的代码和它的工作

交替进近

如果出于任何原因需要避免设置注册表项,则可以直接使用IE COM浏览器

您可以通过添加对Microsoft Internet控件的引用来执行此操作,然后执行以下代码

Sub dothis()
Dim XMLHTTP As Object: Set XMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0")
Dim htmlEle1 As IHTMLElement
Dim htmlDoc As HTMLDocument
'Set htmlIDoc = htmlDoc

Dim urlName As String

urlName = "https://www.oddschecker.com/golf/the-masters/2018-us-masters/winner"

Dim ie As InternetExplorerMedium

Set ie = New InternetExplorerMedium

ie.Visible = False
ie.navigate2 urlName

While ie.readyState <> READYSTATE_COMPLETE

    DoEvents
Wend

Set htmlDoc = ie.document

Debug.Print (htmlDoc.documentMode)
For Each htmlEle1 In htmlDoc.getElementsByClassName("eventTableHeader")(0).Children
    If InStr(htmlEle1.className, "bookie-area") <> 0 Then
       Debug.Print htmlEle1.Children(0).children(0).getAttribute("title")
    End If
Next htmlEle1

End Sub
Sub dothis()
Dim XMLHTTP作为对象:设置XMLHTTP=CreateObject(“MSXML2.XMLHTTP.6.0”)
作为IHTMLElement的Dim HTMLLEE1
将htmlDoc设置为HTMLDocument
'设置htmlIDoc=htmlDoc
将URL名称设置为字符串
URL名称=”https://www.oddschecker.com/golf/the-masters/2018-us-masters/winner"
Dim ie作为InternetExplorerMedium
设置ie=新的InternetExplorerMedium
可见=假
ie.urlName
而ie.readyState readyState\u已完成
多芬特
温德
设置htmlDoc=ie.document
Debug.Print(htmlDoc.documentMode)
对于htmlDoc.getElementsByClassName(“eventTableHeader”)(0)中的每个htmle1
如果InStr(htmlEle1.className,“赌注区域”)为0,则
Debug.Print htmlEle1.Children(0).Children(0).getAttribute(“标题”)
如果结束
下一个HTMLE1
端接头
现在你可以看到
a
aside


不要使用
htmlDoc.body.innerHTML=.responseText
尝试
htmlDoc.clear()
然后
htmlDoc.write(.responseText)
不能使用htmlDoc.write-“编译错误:函数或接口标记为受限,或者函数使用Visual Basic不支持的自动类型”您是否可以使用
IHTMLDocument2
界面将文档转换为另一个对象?执行
REG添加“HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE\U BROWSER\U EMULATION”/v excel.exe/t REG_DWORD/d 11001/f
并重新启动excel,将新HTMLDocument的文档模式设置为IE11谢谢@FlorentB.,我知道IE浏览器的模拟设置,从没想过它也会以同样的方式适用于MSHTML库。谢谢你指出这一点。我已经测试过了,效果很好。我在IE设置中将站点添加到受信任的站点,看看它是否有帮助,你的系统上有哪个IE版本?那么这两种方法都应该有效,我已经在Windows 7+IE 11上测试过了