我正在尝试抓取Newegg网站以获取产品价格。当我运行这段代码时,它会完成这项工作。
Sub test()
Dim objIE As InternetExplorer
Set objIE = New InternetExplorer
objIE.Visible = True
objIE.Navigate "https://www.newegg.com/Product/Product.aspx?item=1TS-000E-083F2"
Do While objIE.ReadyState <> READYSTATE_COMPLETE
Loop
Debug.Print objIE.Document.getElementsByClassName("price-current")(0).Children(1).innerText
End Sub
但是,当我尝试使用XML来加快执行速度时,我遇到了运行时错误91:对象变量或未设置块变量
下面是我尝试实现的代码段。
Sub testxml()
Dim XMLPage As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
XMLPage.Open "GET", "https://www.newegg.com/Product/Product.aspx?item=1TS-000E-083F2", False
XMLPage.send
HTMLDoc.body.innerHTML = XMLPage.responseText
Debug.Print HTMLDoc.getElementsByClassName("price-current")(0).Children(1).innerText
End Sub
您正在尝试获取通过以下代码获得的集合元素的第二个Child
innerText
属性:
HTMLDoc.getElementsByClassName("price-current")(0)
发生此错误,因为此页面上不存在HTMLDoc.getElementsByClassName("price-current")(0)
错误提示中的"对象"。
您可以通过以下方式进行检查:
Debug.Print HTMLDoc.getElementsByClassName("price-current").Length
它将为 0,表示不存在具有此类的元素。如果它存在于IE自动化中,这意味着这个元素是通过JavaScript生成的HTML的一部分,XMLHTTP请求在其响应中不会有它。
这有帮助吗?
Dim XMLPage As Object
Dim HTMLDoc As Object
Set XMLPage = New MSXML2.XMLHTTP60
Set HTMLDoc = New MSHTML.HTMLDocument
堆栈上有一些关于何时使用new等的文章,所以我不打算介绍它。