我检查了浏览器生成的页面和VBA XMLHTTP请求的字符串响应是否都具有相同的树结构,其中一个标记是aside的子代。
不幸的是,当我想返回书名(即a的title属性)时,访问第一个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
这种行为是否与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
现在您可以看到
a
是aside
的子级关于vba - VBA不会根据其树形结构读取XMLHTTP请求的响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49501406/