Excel VBA:在Internet Explorer中等待JavaScript执行
我正在尝试在Excel VBA中进行一些网页抓取。 以下是我遇到的代码部分:
IE.Navigate URL Do DoEvents Loop While IE.ReadyState <> 4 Or IE.Busy = True Set doc = IE.document
运行这个doc
包含仍然有未执行的JavasScript的HTML。 这是尚未执行的脚本的签名:
<SCRIPT type=text/javascript> goosSearchPage.Initialize(...)...; </SCRIPT>
我可以通过执行Application.Wait(Now + TimeValue(x))
来等待执行,但实际上这并不令人满意,因为脚本执行的时间量取决于input是相当可变的。
有没有办法等待脚本完成评估或直接在doc
对象中评估脚本?
我发现代码等待一个页面完成。 每个笔记在这里 ,它需要Microsoft Internet控制作为您的代码中的参考。
代码复制在这里,以防万一链接死亡:
'Following code goes into a sheet or thisworkbook class object module Option Explicit 'Requires Microsoft Internet Controls Reference Library Dim WithEvents ie As InternetExplorer Sub start_here() Set ie = New InternetExplorer 'Here I wanted to show the progress, so setting ie visible ie.Visible = True 'First URL to go, next actions will be executed in 'Webbrowser event sub procedure - DocumentComplete ie.Navigate "www.google.com" End Sub Private Sub ie_DocumentComplete(ByVal pDisp As Object, URL As Variant) 'pDisp is returned explorer object in this event 'pDisp.Document is HTMLDocument control that you can use 'Following is a choice to follow, 'since there is no do-loop, we have to know where we are by using some reference 'for example I do check the URL and do the actions according to visited URL 'In this sample, we use google entry page, set search terms, click on search button 'and navigate to first found URL 'First condition; after search is made 'Second condition; search just begins If InStr(1, URL, "www.google.com/search?") > 0 Then 'Open the first returned page ie.Navigate pDisp.Document.getelementsbytagname("ol")(0).Children(0).getelementsbytagname("a")(0).href ElseIf InStr(1, URL, "www.google.com") > 0 Then pDisp.Document.getelementsbyname("q")(0).Value = "VB WebBrowser DocumentComplete Event" pDisp.Document.getelementsbyname("btnG")(0).Click End If End Sub
你实际上可以用ie窗口来评估javascript函数。 但是你必须设置一个callback函数,因为函数将被评估为asynchronous。