我检查了浏览器生成的页面和VBA XMLHTTP请求的字符串响应是否都具有相同的树结构,其中一个标记是aside的子代。

不幸的是,当我想返回书名(即a的title属性)时,访问第一个aside的孩子时出错。结果是,我需要使用代码来假设标签是旁边的兄弟,才能使其正常工作:

vba - VBA不会根据其树形结构读取XMLHTTP请求的响应-LMLPHP

必需参考: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


这种行为是否与HTML5元素无关,而VBA认为它是一个半闭标签呢?

最佳答案

因此,这花了很多时间才能弄清楚。问题是您不能以这种方式这样做。启动新的HTMLDocument时,默认情况下将其documentMode设置为5

因此,当我们在其中加载写入任何HTML时,它不了解这些HTML5标签,而只是进行自己的更正。这与在IE6浏览器中运行HTML5站点一样好。不幸的是,我无法找到一种方法来允许我们使用更高的documentMode创建/解析文档。

更新资料

感谢@FlorentB指出仿真模式也适用于MSHTML库。我已经从下面知道了

Embedding Youtube Videos in webbrowser. Object doesn't support property or method

但是我认为它不适用于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 Controls的引用来执行此操作,然后执行以下代码

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


现在您可以看到aaside的子级

vba - VBA不会根据其树形结构读取XMLHTTP请求的响应-LMLPHP

关于vba - VBA不会根据其树形结构读取XMLHTTP请求的响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49501406/

10-10 17:44
查看更多