如何在java中获取完全加载页面的html(使用javascript)作为输入

How to get html of fully loaded page (with javascript) as input in java?

本文关键字:使用 html javascript 输入 java 获取 加载      更新时间:2023-09-26

我需要解析页面,除了页面上的一些元素是动态加载的之外,一切都很好。我将jsoup用于静态元素,然后当我意识到我真的需要动态元素时,我尝试了javafx。我读了很多关于stackoverflow的回答,其中有很多关于使用javafxWebEngine的建议。所以我以这个代码结束。

@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.w3.dom.Document制作了一个字符串并打印出来,但它也没用。show()向我展示了完全加载的页面(页面上有我需要呈现的元素),但html代码中(输出中)没有我需要的元素。

这是我处理这个问题的第三天,当然,缺乏经验是我的主要问题,但我不得不说:我被卡住了。这是我在阅读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或smth渲染html的库?我真的需要一些建议,不想放弃。

Worker.State.SUCCEEDED之后返回的DOM模型应该已经被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,或者重新访问日志解析算法。

听起来您希望在页面上的Javascript完成对原始HTML的修改后,从动态页面中呈现DOM。这在Java中并不容易做到,因为您需要使用嵌入式Javascript引擎来实现类似浏览器的功能。如果您只关心从Java中读取网页,那么您可能需要研究Selenium,因为它可以控制浏览器,并允许您将渲染的HTML拉入Java。

这个答案可能也有帮助:

在(任何)Java程序中渲染JavaScript和HTML(Access渲染的DOM树)?