gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:06:45 24 4
gpt4 key购买 nike

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

不幸的是,当我想返回 bookie 名称时,它是 a 的标题属性,我在访问 aside 的第一个 child 时遇到错误。事实证明,我需要使用代码假设 a 标签是 aside 的同级标签才能使其正常工作:

enter image description here

需要引用: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

此行为是否与 aside 是 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

的 child

HTML5 Parsing

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com