使用Java从网站获取InnerHTMLof JS

时间:2016-08-21 20:12:32

标签: javascript java eclipse nashorn

目标:从Yahoo Finance Page获取JavaScript元素的内部文本。请参阅

enter image description here

我可以使用下面的代码获取innerHTML

document.getElementsByClassName('D(ib) Va(t)')[15].childNodes[2].innerHTML

但是,我无法找到一种方法将此信息传达给Java中的Yahoo Finance页面

我已经简要地尝试了以下API:

  • JS​​oup
  • 的HtmlUnit
  • 犀牛

我认为Nashorn可以得到我正在寻找的文字,但我还没有能够做到。

如果有人做过类似的事情或者能指出我正确的方向,那将非常感激。

如果需要更多详细信息,请与我们联系。

1 个答案:

答案 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&region=US&modules=assetProfile%2CsecFilings%2CcalendarEvents&corsDomain=finance.yahoo.com