2013-08-03 13 views
7

私はページを解析する必要がありますが、ページ上のいくつかの要素が動的に読み込まれる点を除いて、すべては問題ありません。静的要素にjsoupを使用したところ、動的要素が本当に必要であることがわかったとき、私はjavafxを試みました。私はstackoverflowに関する多くの回答を読んで、javafx WebEngineを使用するための多くの推奨事項がありました。だから私はこのコードで終わった。Javaの入力として完全に読み込まれたページのHTMLを取得するにはどうすればよいですか?

@Override 
public void start(Stage primaryStage) { 
    WebView webview = new WebView(); 
    final WebEngine webengine = webview.getEngine(); 
    webengine.getLoadWorker().stateProperty().addListener(
      new ChangeListener<State>() { 
       public void changed(ObservableValue ov, State oldState, State newState) { 
        if (newState == Worker.State.SUCCEEDED) { 
         Document doc = webengine.getDocument(); 
         //Serialize DOM 
         OutputFormat format = new OutputFormat (doc); 
         // as a String 
         StringWriter stringOut = new StringWriter();  
         XMLSerializer serial = new XMLSerializer (stringOut, format); 
         try { 
          serial.serialize(doc); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
         // Display the XML 
         System.out.println(stringOut.toString()); 
        } 
       } 
      }); 
    webengine.load("http://detail.tmall.com/item.htm?spm=a220o.1000855.0.0.PZSbaQ&id=19378327658"); 
    primaryStage.setScene(new Scene(webview, 800, 800)); 
    primaryStage.show(); 
} 

文字列をorg.w3c.dom.Documentから作成して印刷しました。しかしそれは役に立たなかった。 primaryStage.show()は完全にロードされたページを表示しましたが(要素をページにレンダリングする必要があります)、HTMLコードに必要な要素はありませんでした(出力時)。

私はこの問題に取り組んでいる3日目ですが、もちろん経験の欠如が私の主な問題ですが、それでも私は固執しています。これは、Javaの完全なリファレンスを読んだ後、私の最初のJavaプロジェクトです。私は実世界の経験を(そして楽しみながら)得るためにそれを作ります。私は中国の "eBay"のパーサを作りたいと思う。ここで

は問題と私のテストケースがある:あなたが見ることができるようにあなたが表示する場合

http://detail.tmall.com/item.htm?spm=a220o.1000855.0.0.PZSbaQ&id=19378327658 は、必要性 "15.20"

動的にロードされた割引を受けるために、 "129.00"

http://item.taobao.com/item.htm?spm=a230r.1.14.67.MNq30d&id=22794120348 が必要最初のブラウザでは、このページは、元の価格を参照してください秒後またはそれを割引。

この動的割引をHTMLページから取得することも可能ですか?私が解析する必要がある他の要素は静的です。次に試すもの:javascriptでhtmlをレンダリングする別のライブラリか、それとも別のライブラリですか?私は本当にいくつかのアドバイスが必要です、あきらめたくありません。

答えて

1

DOMモデルが返されます。

あなたのコードは、FX 7u40と8.0 devでテストされています。

<DIV id="J_PromoBox"><EM class="tb-promo-price-type">夏季新品</EM><EM class="tm-yen">¥</EM>  
<STRONG class="J_CurPrice">129.00</STRONG></DIV> 

動的にあなたが探したデータ(129.00)とボックスをロードされている:私は、ログに次の出力を参照してください。

JDKを7u40にアップグレードするか、ログ解析アルゴリズムを再訪したい場合があります。

0

ページ上のJavaScriptが元のHTMLの変更を完了した後で、レンダリングされたDOMを動的ページから欲しいと思うようです。これは、組み込みのJavascriptエンジンでブラウザのような機能を実装する必要があるため、Javaで行うのは簡単ではありません。 JavaからWebページを読むだけで気になる人は、Seleniumを調べる必要があります。ブラウザを制御し、レンダリングされたHTMLをJavaに取り込むことができるからです。

この回答にも役立つかもしれない:Worker.State.SUCCEEDEDはすでにジャバスクリプトによって処理されshoulb後

Render JavaScript and HTML in (any) Java Program (Access rendered DOM Tree)?

+0

ありがとうございます!私は今セレンの文書を読んでいます、これが助けてくれることを願っています。また、私は実際にページをレンダリングする必要はありません、私はさらに解析するための入力として処理されたhtmlだけが必要です。 – rivf

関連する問題