如何在java中获取完整加载页面(带有javascript)的html作为输入?

如何在java中获取完整加载页面(带有javascript)的html作为输入?,java,javascript,html,javafx-2,javafx,Java,Javascript,Html,Javafx 2,Javafx,我需要解析页面,除了页面上的一些元素是动态加载的外,一切都正常。我将jsoup用于静态元素,当我意识到我确实需要动态元素时,我尝试了javafx。我读了很多关于stackoverflow的回答,有很多关于使用JavaFXWebEngine的建议。所以我以这个代码结束 @Override public void start(Stage primaryStage) { WebView webview = new WebView(); final WebEngine webengine

我需要解析页面,除了页面上的一些元素是动态加载的外,一切都正常。我将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();
} 
@覆盖
公共无效开始(阶段primaryStage){
WebView WebView=新建WebView();
final-WebEngine-WebEngine=webview.getEngine();
webengine.getLoadWorker().stateProperty().addListener(
新的ChangeListener(){
公共无效已更改(ObservalEvalue ov、State oldState、State newState){
if(newState==Worker.State.successed){
Document doc=webengine.getDocument();
//序列化DOM
OutputFormat=新的OutputFormat(单据);
//一串
StringWriter stringOut=新StringWriter();
XMLSerializer serial=新的XMLSerializer(stringOut,格式);
试一试{
序列化(doc);
}捕获(IOE异常){
e、 printStackTrace();
}
//显示XML
System.out.println(stringOut.toString());
}
}
});
webengine.load(“http://detail.tmall.com/item.htm?spm=a220o.1000855.0.0.PZSbaQ&id=19378327658");
设置场景(新场景(webview,800800));
primaryStage.show();
} 
我从org.w3c.dom.Document制作了字符串并将其打印出来。但也没用。show()向我显示了完全加载的页面(页面上有我需要呈现的元素),但html代码中没有我需要的元素(在输出中)

这是我在这个问题上工作的第三天,当然缺乏经验是我的主要问题,不过我不得不说:我被卡住了。这是我阅读java完整参考资料后的第一个java项目。我这样做是为了获得一些真实世界的经验(也是为了好玩)。我想做中文易趣的解析器

下面是问题和我的测试用例:

需要获得动态加载的折扣“129.00”

需要“15.20”

正如你们所看到的,若你们在第一次使用浏览器查看这个页面,你们会看到原价,在第二次左右的折扣之后


甚至可以从html页面获得这种动态折扣吗?我需要解析的其他元素是静态的。下一步要尝试什么:使用javascript或smth其他工具呈现html的另一个库?我真的需要一些建议,但我不想放弃。

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

这个答案也可能有助于:


Worker.State.successed
之后返回的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
这是一个动态加载的框,其中包含您查找的数据(
129.00


您可能需要将JDK升级到7u40或重新访问日志解析算法。

谢谢!我现在正在阅读selenium文档,希望对您有所帮助。另外,我并不需要呈现页面,我只需要处理html作为进一步解析的输入。