为什么我的使用VBA的Scrape Text代码只能在Debug中工作

时间:2019-05-24 23:29:17

标签: excel vba web-scraping

我已经编写了一些代码来从Google专利网站上抓取特定日期。复习了许多示例之后,我弄清楚了getElementsByClassName可以获取所需的日期。当我逐步进入调试模式并生成所需的MsgBox时,以下代码有效。但是,当我运行它时,它提示我“运行时错误'91':对象变量或未设置块变量。”

无论我认为这可能是一个问题,我都添加了延迟。我还取消了代码与任何与Excel电子表格的交互的关联,在这些电子表格中,我将最终放置日期,只是为了使其尽可能简单。我还将代码从原始电子表格复制到了一个新的空白电子表格,但同样存在问题。

任何帮助将不胜感激。

Sub Get_Date()
Dim ie As InternetExplorer
Dim sURL As String
Dim strGrant As Variant

    Set ie = New InternetExplorer
sURL = "https://patents.google.com/patent/US6816842B1/en?oq=6816842"

ie.navigate sURL
ie.Visible = False

Do While ie.Busy Or ie.ReadyState < 4
    DoEvents
Loop

strGrant = ie.document.getElementsByClassName("granted style-scope application-timeline")(0).innerText

Do While ie.Busy Or ie.ReadyState < 4
    DoEvents
Loop

MsgBox strGrant

ie.Quit

End Sub
    ````

1 个答案:

答案 0 :(得分:2)

根据我的评论,这可能是时间安排问题。在类似问题的其他答案中也涉及到这一点。要考虑的主要事项是:

  1. 使用适当的页面加载等待:While IE.Busy Or ie.readyState < 4: DoEvents: Wend
  2. 可能是timed loop,试图将元素设置为变量,然后测试是否设置。

可替代地,有些微不足道,但似乎所有授予的日期都与发布日期(专利发布日期)相同。如果是这样,则可以使用xhr获取发布日期

Option Explicit   
Public Sub GetDates()
    Dim html As HTMLDocument, i As Long, patents()
    patents = Array("US7724240", "US6876312", "US8259073", "US7523862", "US6816842B1")
    Set html = New HTMLDocument

    With CreateObject("MSXML2.XMLHTTP")
        For i = LBound(patents) To UBound(patents)
            .Open "GET", "https://patents.google.com/patent/" & patents(i) & "/en?oq=" & patents(i), False
            .setRequestHeader "User-Agent", "Mozilla/5.0"
            .send
            html.body.innerHTML = .responseText
            If html.querySelectorAll("[itemprop=publicationDate]").length > 0 Then
                Debug.Print html.querySelector("[itemprop=publicationDate]").DateTime
            End If
        Next
    End With
End Sub