2016-07-26 24 views
1

に取り組んでいないパース私はJsoupネストされたテーブルには、検索ページの結果テーブル

検索があるGoogle keyword searchhttps://www.google.com/finance?q=apple&ei=GEiNV9CILMPksAHJmYXQDg)から結果ページのテーブルからいくつかのデータを解析します。その結果、アップル社などの株価情報が表示されます。私は株価を含むテーブルを解析したい。

HTML構造は次のとおりです。

enter image description here

私のコードは次のとおりです。

public static void testGoogle() throws IOException { 
    Document doc = Jsoup.connect("https://www.google.com/finance?q=apple&ei=GEiNV9CILMPksAHJmYXQDg").userAgent("Mozzila").get(); 

    Elements mainbody = doc.select("div.elastic>" 
      + "div#app.g-section.g-tpl-left-11p4em>div#gf-viewc.g-unit>div.fjfe-content>div.g-wrap>" 
      + "div.g-section.g-tpl-right-1.sfe-break-top-5>div.g-unit>div.g-c.sfe-break-right>" 
      + "div#related > div.id-related-table.gf-table > table)"); 


(Also tried) 
//+ "div#related > div.id-related-table.gf-table > table#cc-table.gf-table)"); 

System.out.println("Html " + mainbody); 
} 

私はのdiv#関連する部分までの情報を得ることができますが、その後の表にはありませんショー。私は正しいCSSパスを取得していることを確認するためにクロムのCSSのセレクタとXpathのオプションを使用してみました。 jsoupがこのテーブルから解析していないというCSSパスやその他の理由がない場合に備えて、アドバイスをいただければ幸いです。前もって感謝します!

答えて

1

あなたが直面している問題は、JavaScriptを使用してブラウザにロードされた後にページDOMが変更されることです。 Jsoupは元のソースコードを解析して動作します。レンダリングされたDOMを解析することはできません。そのテーブルを解析するには、ページをHTML Unitのようにレンダリングしてから、Jsoupを使用する必要があります。

// load page and capture DOM 
    WebClient webClient = new WebClient(); 
    HtmlPage myPage = webClient.getPage("https://www.google.com/finance?q=apple"); 

    // convert to jsoup document 
    Document doc = Jsoup.parse(myPage.asXml()); 

    // clean up resources 
    webClient.close(); 

    // select desired data 
    Elements rows = doc.select("table#cc-table > tbody > tr"); 

    for (Element row : rows) { 
     String symbol = row.select("td.ctsymbol").text(); 
     String name = row.select("td.ctname").text(); 
     String price = row.select("td.rgt").first().text(); 
     System.out.println(symbol + " " + name + " " + price); 
    } 

出力

AAPL Apple Inc. 104.14 
SNDK SanDisk Corporation 76.18 
MSFT Microsoft Corpora... 56.53 
SSNNF SAMSUNG ELECTRONI... 0.00000 
VZ Verizon Communica... 55.09 
HPQ HP Inc 14.15 
IBM Intl. Business Ma... 161.72 
HTCKF HTC CORPORATION S... 11.82 
SNE Sony Corp (ADR) 30.59 
GOOGL Alphabet Inc 762.63 
WDC Western Digital Corp 53.97 
+0

ザック。今までの情報に最も感謝しています。それは動作するようです。受諾する前に、あなたが何が起こっているのか(私の考えを確認できるかどうかは疑問です)。 Jsoupは同じDOMを解析して解析します。 htmlUnitは、DOMの変更を含むブラウザアクションをシミュレートします。それが正しいとすれば、元のGoogleページではなくRESULTというURLをURLで呼び出すと、最初にDOMの変更が発生する理由はわかりません。 –

+1

JSoupは、サーバーから配信されたソースコードを解析します。ただし、ブラウザが同じソースコードを受け取ると、JavaScriptが呼び出されます。 JavascriptはDOMを操作して追加/削除することができます。株価が絶えず変化していることに注目してください。最新の価格を問い合わせるために、AJAXを使用してDOMを更新するJavaScriptがあります。 –

+1

ソースコード(右クリック>ソースコードの表示)とレンダリングされたコード(右クリック>検査)を比較すると、それらが異なっていることがわかります。 HTMLユニットを使用すると、ソースコードをレンダリングしてJavaScriptを起動することができるため、最終結果はブラウザでページを検査した場合の結果と同じになります。 –

関連する問題