【问题标题】:Scraping website using Excel VBA and XML使用 Excel VBA 和 XML 抓取网站
【发布时间】:2018-05-30 21:46:00
【问题描述】:

我正在尝试抓取 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

【问题讨论】:

    标签: excel vba web-scraping


    【解决方案1】:

    您正在尝试获取通过此代码获得的集合元素的第二个 ChildinnerText 属性:

    HTMLDoc.getElementsByClassName("price-current")(0)
    

    发生此错误是因为错误提示中的“对象”HTMLDoc.getElementsByClassName("price-current")(0) 在此页面上不存在。

    您可以通过以下方式进行检查:

    Debug.Print HTMLDoc.getElementsByClassName("price-current").Length
    

    它将为 0,表示不存在此类的元素。如果它为 IE 自动化而存在,则意味着该元素是通过 JavaScript 生成的 HTML 的一部分,XMLHTTP 请求不会在其响应中包含它。

    【讨论】:

    • 谢谢你的解释:)
    【解决方案2】:

    这有帮助吗?

    Dim XMLPage As Object
    Dim HTMLDoc As Object
    
    
    Set XMLPage = New MSXML2.XMLHTTP60
    Set HTMLDoc = New MSHTML.HTMLDocument
    

    堆栈上有一些关于何时使用 new 等的文章,所以我不会介绍它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      相关资源
      最近更新 更多