Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 为什么我使用VBA刮取文本的代码只能在调试中工作_Excel_Vba_Web Scraping - Fatal编程技术网

Excel 为什么我使用VBA刮取文本的代码只能在调试中工作

Excel 为什么我使用VBA刮取文本的代码只能在调试中工作,excel,vba,web-scraping,Excel,Vba,Web Scraping,我已经写了一些代码从谷歌的专利网站上截取具体日期。在回顾了大量示例之后,我找到了获取所需日期的getElementsByClassName。当我在调试模式下单步执行并生成所需的MsgBox时,下面的代码可以工作。但当我运行它时,它会给出“运行时错误'91”:未设置对象变量或With block变量 我在我认为可能存在问题的地方增加了延迟。我还将代码与Excel电子表格的任何交互分离,我最终会在其中输入日期,只是为了使它尽可能简单。我还将原始电子表格中的代码复制到一个新的空白电子表格中,但版本相同

我已经写了一些代码从谷歌的专利网站上截取具体日期。在回顾了大量示例之后,我找到了获取所需日期的getElementsByClassName。当我在调试模式下单步执行并生成所需的MsgBox时,下面的代码可以工作。但当我运行它时,它会给出“运行时错误'91”:未设置对象变量或With block变量

我在我认为可能存在问题的地方增加了延迟。我还将代码与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
    ````
Sub Get_Date()
Dim ie作为InternetExplorer
作为字符串的Dim sURL
作为变体的Dim strGrant
Set ie=新的InternetExplorer
苏尔=”https://patents.google.com/patent/US6816842B1/en?oq=6816842"
例如,导航sURL
可见=假
在ie忙或ie ReadyState<4时执行
多芬特
环
strGrant=ie.document.getElementsByClassName(“授予的样式范围应用程序时间线”)(0)。innerText
在ie忙或ie ReadyState<4时执行
多芬特
环
MsgBox标准溶液
即退出
端接头
````

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

  • 在IE.Busy或IE.readyState<4:DoEvents:Wend时使用适当的页面加载等待:
  • 可能是尝试将元素设置为变量,然后测试是否已设置
  • 或者,有点像赌注,但似乎所有授予的日期都与发布日期(专利发布日期)相同。如果这是真的,那么您可以使用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
    

    总是一个时间问题。使用适当的页面加载等待:IE.Busy或IE.readyState<4:DoEvents:Wend开始并可能尝试将元素设置为变量,然后测试是否设置。谢谢QHarr。我怀疑是时间问题,但仍然不明白为什么我的延迟没有起作用。尽管如此,我还是增加了3秒的延迟,这似乎达到了目的。至于你的第二个建议,我很感谢你的建议,尽管出版物和授予日期并不总是一样的,所以我不确定这是否对我有效,再次感谢。请你也提供几个日期不匹配的例子好吗?我知道你在看什么。谷歌现在列出了专利发布日期和申请发布日期。该应用程序将于18个月后发布。申请后,通常与授予日期不同。另一方面,正如您所观察到的,专利发布日期可能始终与授予日期相同。因为专利的公布和授予日期总是一样的,所以我们从不谈论专利的公布,而是谈论申请的公布,这在某些情况下是有意义的。我想是这样的。我不完全理解,但它看起来是一些聪明的代码,这些例子帮助我理解这些东西。我已经想出了如何从这些专利页上刮取我所需要的大部分东西。我唯一遇到麻烦的是发明家。例如,US7325076B1列出了四位发明人。你知道我如何收集这些名字吗?你想打开一个新问题并添加你当前的代码吗?