使用getElementsByClassName时出错“对象变量或未设置块变量”

时间:2015-07-13 06:24:31

标签: excel vba excel-2010 spreadsheet

我想从亚马逊某些领域中删除。

Atm我正在使用链接,我的vba脚本返回了我的名字和价格。

例如:

我将链接放入A列并获取相应列中的其他字段,f.ex。:http://www.amazon.com/GMC-Denali-Black-22-5-Inch-Medium/dp/B00FNVBS5C/ref=sr_1_1?s=outdoor-recreation&ie=UTF8&qid=1436768082&sr=1-1&keywords=bicycle

但是,我还想拥有product description

这是我目前的代码:

Sub ScrapeAmz()

 Dim Ie As New InternetExplorer
 Dim WebURL
 Dim Docx As HTMLDocument
 Dim productDesc
 Dim productTitle
 Dim price
 Dim RcdNum

Ie.Visible = False

For RcdNum = 2 To ThisWorkbook.Worksheets(1).Range("A65536").End(xlUp).Row

    WebURL = ThisWorkbook.Worksheets(1).Range("A" & RcdNum)
     Ie.Navigate2 WebURL
     Do Until Ie.ReadyState = READYSTATE_COMPLETE
     DoEvents
     Loop
     Set Docx = Ie.Document
     productTitle = Docx.getElementById("productTitle").innerText
     'productDesc = Docx.getElementsByClassName("productDescriptionWrapper")(0).innerText
     price = Docx.getElementById("priceblock_ourprice").innerText
     ThisWorkbook.Worksheets(1).Range("B" & RcdNum) = productTitle
     'ThisWorkbook.Worksheets(1).Range("C" & RcdNum) = productDesc
     ThisWorkbook.Worksheets(1).Range("D" & RcdNum) = price
   Next

End Sub

我正在尝试使用productDesc = Docx.getElementsByClassName("productDescriptionWrapper")(0).innerText获取产品说明。

但是,我收到了一个错误。

Object variable or with block variable not set.

有什么建议为什么我的陈述不起作用?

感谢您的回复!

1 个答案:

答案 0 :(得分:1)

我非常确定您的问题是由于在文档完全加载之前尝试访问该文档而导致的。你只是检查ie.ReadyState。

这是我对使用IE控件加载页面的时间表的理解。

  1. 浏览器连接到页面:ie.ReadyState = READYSTATE_COMPLETE。此时,您可以访问ie.document而不会导致错误,但文档只是开始加载。
  2. 文档已满载:ie.document.readyState = "complete" (请注意,框架可能仍在加载,并且可能仍在进行AJAX处理。)
  3. 所以你真的需要检查两个事件。

    Do
        If ie.ReadyState = READYSTATE_COMPLETE Then
            If ie.document.readyState = "complete" Then Exit Do
        End If
        Application.Wait DateAdd("s", 1, Now)
    Loop
    

    编辑:在实际查看您正在尝试抓取的页面后,看起来它失败的原因是因为您尝试获取的内容位于iframe中。在获得内容之前,您需要浏览iframe。

    ie.document.window.frames("product-description-iframe").contentWindow.document.getElementsByClassName("productDescriptionWrapper").innerText