1

ページの読み込みが完了するまで入力されていないページのデータを解析しようとしています。このため、私は簡単な解決策を得ることができません

while (wb.ReadyState != WebBrowserReadyState.Complete)
{
    Application.DoEvents();
}

仕事に。View Generated Source (After AJAX/JavaScript) in C#にあるソリューションを使用してみましたが、ロード後のデータがダウンロードされるのを待つ方法がわかりません。助けてください!ページがロードされると、データはページに自動的に入力されるため、ユーザーの操作は必要ありません。ありがとう!

答えがタイマーを使用することであるWebBrowser ajax コンテンツを待っていることがわかりました.... Thread.Sleep() (スレッドを完全にブロックする) の代わりにタイマーを使用してこれを修正する方法がわかりません。簡単なサンプルコードでこれを使用する適切な方法を理解していますか? 再度、感謝します

AJAX を自分で呼び出すという提案を検討していますが、タイマーを使用する方がよいと思います。私はまだこの件について助けを求めています。ありがとう。

4

2 に答える 2

1

私の状況では、次の方法で解決しました:

while (wb.ReadyState != WebBrowserReadyState.Complete)
    Application.DoEvents();

while (wb.Document.GetElementById(elementId) != null && wb.Document.GetElementById(elementId).InnerHtml == null)
    Application.DoEvents();

2 番目の while ループは、指定された要素が AJAX によって設定されるまで待機します。私の状況では、URL に無効なストア # が指定されている場合、404 タイプのページに転送されます。最初の条件は、要素がまだページに存在することを確認しましたが、404 ページに送信された場合は存在しません。2 番目の条件は、要素が設定されるまで待機します。

AJAX がページにデータを入力した後、wb.Document.InnerText と wb.DocumentStream にダウンロードした html がまだ含まれている場合、興味深いことがわかりました。wb.Document.InterHTML のみが更新されます。私の状況では、結果から HtmlAgilityPack HtmlDocument を作成しています。DocumentStream が古くなるため、次のようにドキュメントを再作成する必要があります。

htmlDoc.LoadHtml("<html><head><title>" + wb.DocumentTitle + "</title></head><body>" + wb.Document.Body.InnerHtml + "</body></html>");

私の状況では、ヘッダーのメタ/スクリプトは気にしないので、これは機能します。誰かがそれらのことを気にかけている場合、そのコード行を自分の使用に合わせて適応させる必要があることは明らかです。

于 2012-05-29T17:37:52.850 に答える
1

あなたが扱っている Firebug for Firefox のページを見てください。ページの読み込み中 (ただし、ページの最初の部分が読み込まれた後) に発生する後続のすべての HTTP Ajax リクエストの実際の生データを表示できる [ネット] タブがあります。

このデータを見ると、ID などを含む GET 要求に応答して、まさに探しているものを含む JSON またはその他の XML データを見つけることができる可能性が高くなります。

そのリンクされた投稿で言及されているように「偽の」ブラウザを使用することは、必要以上に多くのデータをダウンロードして解析する可能性が高いため、最終的なパフォーマンスが最悪になるため、最後の手段と見なす必要があります。

于 2012-05-29T05:53:10.333 に答える