【问题标题】:VBScript GetElementsByClassName not supported?不支持 VBScript GetElementsByClassName?
【发布时间】:2017-12-04 20:31:47
【问题描述】:

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

【问题讨论】:

  • comes from IHTMLElement6 - 也来自IHTMLDocument7Should work 在 Vista+ 上。您也可以在html.body 上试用。
  • 谢谢,您能帮我建议如何将其应用于上述代码吗?由于这是在 VBScript 中,我必须在代码中进行所有声明,因为我无法选择与在 VBA 中相同的引用。
  • html.body.getElementsByClassName?
  • 谢谢,我尝试了这个并得到了同样的错误 - 只是在这种情况下它说:不支持'body.getElementsByClassName'。如果您对如何解决这个问题有更多想法 - 将不胜感激。谢谢。
  • MSHTML 的行为因实例化方式而异 - 它根据其早期绑定还是后期绑定(严重依赖 IDispatch)公开不同的接口。您是后期绑定并且没有暴露getElementsByClassName 的接口可用。您可以遍历document.all() 并查看每个item.className

标签: vba vbscript vb6


【解决方案1】:

MSHTML 的行为取决于它被实例化的方式——它暴露不同的接口取决于它是早期绑定还是晚期绑定(它严重依赖于IDispatch)。

您是后期绑定并且没有暴露getElementsByClassName 的接口可用。

您可以遍历document.all() 并查看每个item.className

【讨论】:

  • 难道不能在后期绑定时指定所需的 MSXML 版本吗?
【解决方案2】:

我使用类似的代码从 POST 请求中检索数据。 getElementsByClassName 仅在前面有另一个命令(如“msgbox 1”)或任何将脚本暂停几分之一秒的情况下才有效。 然后我尝试了 Wscript.Sleep 200,将其减少到可能的最小数字,它仍然有效。

Wscript.Sleep 1 ' This line got it working.
msgbox html.getElementsByClassName("match-info-box-con")(0).innertext'

【讨论】:

  • 您的问题似乎是您没有让文档有时间加载,这发生在后台。这与OP的问题无关。
  • 实际上,没有那 1 毫秒,错误是一样的。我不知道为什么 1 毫秒就足够了,但这证明 getElementsByClassName 确实受支持。不需要另一种方式来初始化 html 对象。
【解决方案3】:

我花了一些时间来详细阐述一个工作示例。 感谢 GSerg 指出加载延迟。那是准确的。 不得不稍微调整代码以使其正常工作。 基于前面的 cmets,也许 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!"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2012-03-23
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多