我正在尝试将一些工作的VBA代码转换为VBScript,但在尝试使用getElementsByClassName方法时仍然在VBScript中出现错误。这是完整的代码:
option explicit
Dim XMLPage, html
Set XMLPage = WScript.CreateObject("MSXML2.XMLHTTP")
Set html= CreateObject("HTMLFile")
XMLPage.Open "GET", "https://www.hltv.org/stats/matches/mapstatsid/48745/immortals-vs-dignitas", False
Wscript.Sleep 50
XMLPage.send
Wscript.Sleep 50
If XMLPage.Status <> 200 Then MsgBox XMLPage.statusText
html.Open
html.write XMLPage.responseText
html.Close
'msgbox html.getElementsByTagName("tbody")(0).innertext'WORKS
msgbox html.getElementsByClassName("match-info-box-con")(0).innertext'DOESNT WORK
如果我发表评论并运行它来搜索标签名称(上面一行代码) - 它工作正常没问题。
我怀疑它与变量html
的声明方式有关,正如我所理解的那样。 getElementsByClassName
来自IHTMLElement6
- 但我不确定如何在VBScript中使用它。
答案 0 :(得分:2)
MSHTML的行为方式取决于它的实例化方式 - 它根据其早期或晚期绑定(它严重依赖IDispatch
)公开不同的接口。
您是晚期绑定,并且没有可用的getElementsByClassName
曝光界面。
您可以循环document.all()
并查看每个item.className
。
答案 1 :(得分:0)
我使用类似的代码从POST请求中检索数据。 getElementsByClassName仅在带有其他命令(例如“ msgbox 1”)或任何可将脚本暂停一秒的内容时有效。 然后,我尝试了Wscript.Sleep 200,将其减少到最小数量,但仍然有效。
Wscript.Sleep 1 ' This line got it working.
msgbox html.getElementsByClassName("match-info-box-con")(0).innertext'
答案 2 :(得分:0)
我花了一些时间来阐述一个可行的例子。 感谢GSerg指出负载延迟。没错 不得不微调代码以使其正常运行。 根据前面的评论,MSHTML的行为可能取决于所解析的代码。因此是下面的附加元标记。
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
Dim htmldoc: Set htmldoc = CreateObject("htmlfile")
'
URL = "https://stackoverflow.com/questions/44853941/vbscript-getelementsbyclassname-not-supported"
' sEnv = ""
'
objHTTP.Open "GET", URL, False
' objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.send ' (sEnv)
ttext = objHTTP.responsetext
ttext = "<meta http-equiv=""X-UA-Compatible"" content=""IE=EDGE,chrome=1"" />" & vbnewline & ttext
htmldoc.write ttext
htmldoc.close
htmldoc.designMode = "on" ' Refer to https://developpaper.com/method-of-parsing-html-documents-by-vbs-htmlfile/
WScript.ConnectObject htmldoc, "htmldoc_"
Sub htmldoc_onreadystatechange()
If htmldoc.readyState = "interactive" Then
ttext = htmldoc.getElementsByClassName("fs-headline1").Item(0).innerText
msgbox ttext
Wscript.quit
End If
End Sub
'-----------------
Wscript.Sleep 10000 ' Random timeout
msgbox "Timeout!"