4

Excel VBAでWebスクレイピングをしようとしています。これが私が問題を抱えているコードの一部です:

IE.Navigate URL
Do
  DoEvents
Loop While IE.ReadyState <> 4 Or IE.Busy = True
Set doc = IE.document

実行後、これdocにはまだ実行されていない JavaScript が含まれる html が含まれます。これは、実行されていないスクリプトの署名です。

<SCRIPT type=text/javascript>
        goosSearchPage.Initialize(...)...;
</SCRIPT>

実行することで実行を待つことができApplication.Wait(Now + TimeValue(x))ますが、スクリプトの実行にかかる時間は入力によってかなり変動するため、実際には満足のいくものではありません。

スクリプトの評価が完了するのを待つか、スクリプトをdocオブジェクトで直接評価する方法はありますか?

4

3 に答える 3

0

ページが完了するのを待つコードを見つけました。ここに記載されているように、コード内の参照としてMicrosoftInternetControlsが必要です。

リンクが切れた場合に備えて、ここに再現されたコード:

'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
于 2012-10-23T13:59:29.290 に答える
0

この投稿はかなり古いものですが、これを行う方法を発見したので、自分自身への返信としても回答します。

jQuery スクリプトの実行後にそこにあると予想されるコンテンツをポイントし、IE オートメーションを介して実行される JavaScript を使用して目的のイベントをトリガーし、ループを実行して目的のコンテンツが表示されるまで待機します。

'This will trigger the jQuery event.
Doc.parentWindow.execScript "$('#optionbox').trigger('change')"

'This is the code that will make you wait. It's surprisingly efficient
Do While InStrB(Doc.getElementById("optionbox").innerHTML, "<desired html tag>") = 0
    DoEvents
Loop
于 2020-08-22T02:17:23.090 に答える
0

実際に ie ウィンドウで JavaScript 関数を評価することができます。ただし、関数は非同期で評価されるため、コールバックを設定する必要があります。

于 2013-10-18T11:38:51.420 に答える