目标:从Yahoo Finance Page获取JavaScript元素的内部文本。请参阅
我可以使用下面的代码获取innerHTML
document.getElementsByClassName('D(ib) Va(t)')[15].childNodes[2].innerHTML
但是,我无法找到一种方法将此信息传达给Java中的Yahoo Finance页面
我已经简要地尝试了以下API:
我认为Nashorn可以得到我正在寻找的文字,但我还没有能够做到。
如果有人做过类似的事情或者能指出我正确的方向,那将非常感激。
如果需要更多详细信息,请与我们联系。
答案 0 :(得分:0)
HtmlUnit似乎与此网站有问题,因为响应也不完整。您可以使用PhantomJS。只需download the binary为您的操作系统创建一个脚本文件(参见API)。
脚本(webpack-dev-server --progress --colors --hot --config ./webpack.config.js --inline
):
yahoo.js
Java代码:
var page = require('webpage').create();
var fs = require('fs');
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36';
page.settings.resourceTimeout = '5000';
page.open('http://finance.yahoo.com/quote/AAPL/profile?p=AAPL', function(status) {
console.log("Status: " + status);
if(status === "success") {
var path = 'yahoo.html';
fs.write(path, page.content, 'w');
}
phantom.exit();
});
<强>输出强>:
try {
//change path to phantomjs binary and your script file
String phantomJSPath = "bin" + File.separator + "phantomjs";
String scriptFile = "yahoo.js";
Process process = Runtime.getRuntime().exec(phantomJSPath + " " + scriptFile);
process.waitFor();
//Jsoup
Elements elements = Jsoup.parse(new File("yahoo.html"),"UTF-8").select("div.asset-profile-container p strong"); //yahoo.html created by script file in same path
for (Element element : elements) {
if(element.attr("data-reactid").contains("asset-profile.1.1.1.2")){
System.out.println(element.text());
}
}
} catch (Exception e) {
e.printStackTrace();
}
注意:的
以下链接返回包含公司信息的JSONObject,但不确定Consumer Goods
参数是否更改或对于公司是否为常量:
https://query2.finance.yahoo.com/v10/finance/quoteSummary/AAPL?formatted=true&crumb=hm4%2FV0JtzlL&lang=en-US®ion=US&modules=assetProfile%2CsecFilings%2CcalendarEvents&corsDomain=finance.yahoo.com