如何在java中获取完全加载页面的html(使用javascript)作为输入
How to get html of fully loaded page (with javascript) as input in java?
我需要解析页面,除了页面上的一些元素是动态加载的之外,一切都很好。我将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树)?
- 使用html中的外部javascript进行数据验证
- 这是使用html快照和谷歌获取的预期结果吗?SEO/SPA
- 使用html表单中的参数调用JavaScript函数
- 有没有一种方法可以仅使用HTML/CSS来隐藏基于特定值的数据单元格
- 在Angular中重新使用HTML端的计算文本
- 当#在iFrame中使用HTML时,阻止页面移动
- 回复'js'仅当请求有错误时(否则使用html)
- 具体化:如何只使用HTML和Javascript制作播放/暂停按钮
- http请求使用html而不是json进行响应
- 使用HTML进行Visual Basic UI设计
- 使用html和Javascript进行客户端排序
- 如何在angularJS中运行for循环而不使用html标记
- 在javascript函数中使用@Html.Raw
- 如何使用HTML/CSS/JavaScript开发桌面应用程序
- 如何使用HTML、CSS和JavaScript创建自动图片库幻灯片
- 在JavaScript中使用HTML变量
- 对javascript使用.html中的select id
- 使用HTML和JS的iPhone游戏中的性能问题,以及appMobi
- 使用HTML标记中的JS变量在Javascript中动态创建HTML
- 允许在Angular控制器或视图中使用html标记