2016-07-17 15 views
2

私は波高情報を収集するのにJsoupを使用しようとしていますSurfline.com。スクリーンショットで私が望む要素があり、それが開発ツールに表示されています。私がJsoupでサイトを擦ると、返された文字列にはdevツールに見られるすべてのものが含まれていますが、必要なものは "1-2ft"です。このサイトはJavascriptの重いもので、javascriptが実際に実行される前にjsoupがhtmlを利用していると仮定しています(実際には手がかりはありません)。 jsoupにpageloadを待つように具体的に指示する必要がありますか、他の重要なコンポーネントが欠落していますか?Jsoup問題ハードコードされていないデータを掻き集める

surfline.com

これは私が使用しているコードです。

Document doc = Jsoup.connect("http://www.surfline.com/surf-report/folly-beach-pier-southside-southeast_5294/").get(); 
    Elements content = doc.select("div[id=current-surf-range]"); 
    System.out.println(content); 

、これは私が私のIDE

<div id="current-surf-range" style="font-size:21px;font-weight:bold;padding-top:7px; padding-bottom: 7px;"></div> 

それはdiv要素の内容は、それに返されることはないだろうと、本当に奇妙に思えるで見ている出力されます。これはJsoupを初めて使用したときのことですが、できる限りドキュメントを読み込もうとしましたが、この特定の問題に触れるようなことは何もありませんでした。どんな洞察も素晴らしいものになり、大いに感謝します。

答えて

2

選択したHTTPライブラリでURLを使ってページをダウンロードすると、必ずしもブラウザに表示される内容が得られません。実際、あなたはそれらが同じであるとは決して期待してはいけません。現代のウェブでは、ウェブページは非常に動的であり、異なるリソースプロバイダへの複数のAPI呼び出しとブラウザ(JavaScriptエンジンを持つ)で実行されるjavascriptを含む非同期的に読み込まれます。

この場合、JSoupは、ブラウザーがページの作成を開始する最初のHTMLです。次に、サーフラインAPIへの一連のXHR呼び出しがあり、ブラウザにデータを持ち込み、現在のサーフレンジを含むページの異なる部分を動的に埋め込みます。


問題にアプローチする最も簡単な方法は、実際のブラウザを起動しますseleniumと呼ばれるブラウザの自動化ツールに切り替えることです。現在のサーフレンジ要素が値を持つのを待つことができ、JSoupを続行したい場合は、ページソースを取得し、さらに解析するためにJSoupにフィードします。

もう1つのアプローチは、ページがブラウザ開発者ツールで作成した要求を調べ、コード内でこれらの要求をシミュレートし、JSON応答を解析してサーフ予測データを抽出することです。

関連する問題