VBScript GetElementsByClassName不受支持?

时间:2017-06-30 19:52:45

标签: vba vbscript vb6

我正在尝试将一些工作的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

最后一行代码是发生以下错误的地方: enter image description here

如果我发表评论并运行它来搜索标签名称(上面一行代码) - 它工作正常没问题。

我怀疑它与变量html的声明方式有关,正如我所理解的那样。 getElementsByClassName来自IHTMLElement6 - 但我不确定如何在VBScript中使用它。

3 个答案:

答案 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!"