Excel 为什么我使用VBA刮取文本的代码只能在调试中工作
我已经写了一些代码从谷歌的专利网站上截取具体日期。在回顾了大量示例之后,我找到了获取所需日期的getElementsByClassName。当我在调试模式下单步执行并生成所需的MsgBox时,下面的代码可以工作。但当我运行它时,它会给出“运行时错误'91”:未设置对象变量或With block变量 我在我认为可能存在问题的地方增加了延迟。我还将代码与Excel电子表格的任何交互分离,我最终会在其中输入日期,只是为了使它尽可能简单。我还将原始电子表格中的代码复制到一个新的空白电子表格中,但版本相同 任何帮助都将不胜感激Excel 为什么我使用VBA刮取文本的代码只能在调试中工作,excel,vba,web-scraping,Excel,Vba,Web Scraping,我已经写了一些代码从谷歌的专利网站上截取具体日期。在回顾了大量示例之后,我找到了获取所需日期的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标准溶液
即退出
端接头
````
根据我的评论,这可能是一个时间问题。类似问题的其他答案中也涉及到了这一点。需要考虑的主要事项是:
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列出了四位发明人。你知道我如何收集这些名字吗?你想打开一个新问题并添加你当前的代码吗?