java - 使用 Jsoup 解析 nodeList 值

标签 java parsing web jsoup

http://www.smbs.biz/ExRate/StdExRate.jsp

在这个网站中,我尝试解析货币表的值。

表中的以下值是我要提取的值。

在开发人员工具中,我只能在“元素”窗口中看到该值,而在“源”窗口中看不到该值。我猜数据是在使用ajax时调用的? 如何使用 Jsoup 提取数据?

这是我尝试解析代码的代码,但失败了:

try {
          doc = Jsoup.connect("http://www.smbs.biz/ExRate/StdExRate.jsp").get();
       } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
       }
       //Elements exchangeRateElement = doc.select(".brb0 td:nth-child(3)").eq(1);           
       Element exchangeRateElement = doc.getElementsByClass("brb0").get(10);

       String cur=null;

       for (Node node : doc.childNodes()) {
        System.out.println("node : "+node);
         if (node instanceof TextNode) {
            cur = ((TextNode) node).getWholeText();
            cur = ((TextNode) node).text();
             break;
         }
     }

最佳答案

当我们在禁用 JavaScript 的浏览器中加载页面时,我们注意到该表仍为空。

在重新加载时激活 JavaScript 并监视网络选项卡(chrome 开发工具/F12),我们看到一个请求:

http://www.smbs.biz/ExRate/StdExRate_xml.jsp?arr_value=USD_2016-09-13_2016-10-05

响应包含一个包含所需信息的图表:

<chart 
    [...]   
    <set color='c93749' label='16.09.13' value='1110.6' />
    <set color='c93749' label='16.09.19' value='1112.3' />
    [...]
    <set color='c93749' label='16.10.04' value='1102' />
    <set color='c93749' label='16.10.05' value='1105.1' />
    <styles>
        [...]
    </styles>
</chart>

在请求图表之前,我们需要获取 JSESSION cookie 并将其添加到请求中。

示例代码

String userAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36";

try {
    // response needed to grab the cookies: res.cookies()
    Response res = Jsoup.connect("http://www.smbs.biz/ExRate/StdExRate.jsp")..timeout(10000)
            .userAgent(userAgent).method(Method.GET).header("Host", "www.smbs.biz").execute();

    Document doc = res.parse();

    String startDate = doc.getElementById("startDate").attr("value").replace(".", "-");
    String endDate = doc.getElementById("endDate").attr("value").replace(".", "-");

    doc = Jsoup.connect("http://www.smbs.biz/ExRate/StdExRate_xml.jsp?arr_value=USD_" + startDate+"_" + endDate)
            .userAgent(userAgent).timeout(10000).header("Host", "www.smbs.biz").cookies(res.cookies())
            .header("Connection", "keep-alive").method(Method.GET)
            .referrer("http://www.smbs.biz/ExRate/StdExRate.jsp").get();

    Elements elements = doc.select("chart > set");

    for (Element element : elements) {
        System.out.println(element.attr("label") + ": " + element.attr("value"));
    }

    Element currentRateElement = doc.select("chart > set").last();

    System.out.println("Current rate for " + currentRateElement.attr("label") + ": " + currentRateElement.attr("value"));

} catch (IOException e) {
    e.printStackTrace();
}

输出

16.09.13: 1110.6
16.09.19: 1112.3
16.09.20: 1120
16.09.21: 1119.5
16.09.22: 1116.8
16.09.23: 1103.1
16.09.26: 1104.2
16.09.27: 1106.9
16.09.28: 1103.5
16.09.29: 1095.7
16.09.30: 1096.3
16.10.04: 1102
16.10.05: 1105.1
Current rate for 16.10.05: 1105.1

关于java - 使用 Jsoup 解析 nodeList 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39859680/

相关文章:

java - 在没有其他模块提供该实例的情况下提供实例

c++ - 是否可以从 clang 的解析树中提取预处理器信息?

java - 为 ssl 身份验证编写 java 客户端

java - 如何在java中展平spark数据集中的包装数组

html - Xpath 和 CSS 解析

algorithm - LR(0)/SLR/LR(1) 解析 - 如何选择产生式?

linux - 我可以以某种方式在网络上使用 plink 进行 SSH 检查吗?

java - 使用 Jetty 和 Gradle 自动重新加载静态内容

javascript - 谷歌分析事件跟踪不起作用

java - 如何从方法(如程序中所示)分配数组变量?