2016-03-20 33 views
2

私はWebページを解析し、Jsoupを使用してデータを抽出しようとしています。しかし、リンクは動的であり、詳細を表示する前に待ち受けページをスローします。したがって、Jsoupは詳細ページではなく待機ページを処理しているようです。ページが完全に読み込まれるまで待つようにするにはどうしてですか?jsoupを完了ページ(進行状況ページをスキップする)が読み込まれるまで待ちますか?

+1

URLと実際の例を追加できますか? –

+0

ここでJsoupの代わりにui4jを試すことができます:https://github.com/ui4j/ui4j。 – Stephan

答えて

2

おそらく、問題のページはブラウザ(クライアント側)でJavaScriptによって生成されている可能性があります。 JsoupはJavaScriptを解釈しないので、運が悪いです。ただし、ブラウザの開発者ツールの[ネットワーク]タブでページの読み込みを分析し、ページ読み込み時にどのAJAX呼び出しを行うかを調べることができます。これらの呼び出しにはURLもあり、必要なすべての情報を直接アクセスすることができます。また、実際のブラウザエンジンを使用してページを読み込むこともできます。 Java 8を使用している場合は、そのためにselenium webdriverやJavaFX Webkitコンポーネントなどのライブラリを使用できます。

3

ページが読み込まれると動的にコンテンツの一部が作成される場合は、 JSelpでSeleniumを使うべきです:

WebDriver driver = new FirefoxDriver(); 
driver.get("http://stackoverflow.com/"); 
Document doc = Jsoup.parse(driver.getPageSource()); 
+0

ここでもまた、私が解析しようとしているウェブページがJavaスクリプトを持っているなら、実行を待つことはなく、私は待ち受けページを読み込みます。おそらく、jsoupを使用する代わりに要素をロードするのを待ってすぐに解析する方が良い方法かもしれません。それは私のために働いたようだ。私の初期の質問にはJsoupの使用法が含まれているかもしれません。あなたの答えにはjsoupも含まれています。私は私の質問によく言い聞かせるべきかもしれません。ありがとう! – Thiru

0

私はちょうどlukschの答えをもう少し広げていると思います。私はWebフレームワークに精通していないので、答えは少し難解でした。 Jsoupのようなパーサーを使用してページを動的にロードしていたので、解析を試みる前にすべての要素が完全にロードされていることを知る必要があるため、難しくなりました。そのため、すぐに解析するのではなく、Webdriver(セレン)を使用して要素の状態を確認し、ロードされたら、ページソースを取得して解析するか、Webdriver自体を使用して別のパーサを使用する代わりに必要なデータを収集します。

WebDriver driver = new ChromeDriver(); 
    driver.get("<DynamicURL>"); 
    List<WebElement> elements = null; 
    while (elements == null) 
    { 
     elements = driver.findElements(By.className("marker")); 
     if (!valuePresent(elements)) 
     { 
      elements = null; 
     } 
    } 
    if (elements != null) 
    { 
     processElements(elements); 
    } 
関連する問題