8

ページを解析する必要があります。ページ上の一部の要素が動的に読み込まれることを除いて、すべて問題ありません。静的要素にはjsoupを使用しましたが、動的要素が本当に必要であることに気付いたとき、javafxを試しました。私はstackoverflowに関する多くの回答を読み、javafx WebEngineを使用するための多くの推奨事項がありました. だから私はこのコードで終わりました。

@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 動的に読み込まれる割引「129.00」を取得する必要があります

http://item.taobao.com/item.htm?spm=a230r.1.14.67.MNq30d&id=22794120348 「15.20」が必要

ご覧のとおり、このページをブラウザで最初に表示すると、元の価格が表示され、数秒後に割引が表示されます。

HTMLページからこの動的割引を取得することは可能ですか? 解析する必要があるその他の要素は静的です。次に何を試すか: javascript を使用して html をレンダリングする別のライブラリか、それ以外の機能を使用しますか? 諦めたくないのでアドバイスお願いします。

4

2 に答える 2

1

後に返される DOM モデルはWorker.State.SUCCEEDED、javascript によって既に処理されている必要があります。

あなたのコードは、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 にアップグレードするか、ログ解析アルゴリズムを再検討することをお勧めします。

于 2013-08-05T09:11:56.427 に答える