2016-10-04 2 views
1

http://www.smbs.biz/ExRate/StdExRate.jspсинтаксического анализа Nodelist Значение использования Jsoup

На этом сайте я попытался разобрать значение таблицы для валюты.

Нижеследующее значение в таблице - это значение, которое я хочу извлечь.

В инструменте разработчика я вижу это значение только в окне «Элементы», а не в «исходном» окне. Думаю, данные вызывается при использовании 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; 
     } 
    } 
+0

Вот еще одна тема, которая имеет некоторые relavent ссылки, но короткий ответ нет никакого способа сделать это с JSoup. Это анализатор html и не может правильно разобрать значения, генерируемые вызовами javascript на странице. Http: //stackoverflow.com/questions/7488872/page-content-is-loaded-with-javascript-and-jsoup-doesnt -see-it – Brion

+0

@Brion Если рендеринг страницы является вашей целью, я согласен, что большую часть времени вы должны использовать что-то вроде HtmlUnit или PhantomJS. Если вы выполняете определенные элементы, это зависит от того, как создается контент: если он просто загружается с использованием JavaScript, то jsoup может использоваться (путем имитации одних и тех же запросов), вычисляется контент, тогда нам нужны дополнительные инструменты. В этом случае jsoup может выполнить эту работу, я напишу ответ. –

ответ

1

Когда мы загружаем страницу в браузере с отключенным JavaScript, мы отмечаем, что таблица остается пустой.

Включение JavaScript и мониторинг вкладки сети (хромированные средства разработки/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 и добавить его в запрос.

Пример кода

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 
+0

Работает ... Невероятно! Большое спасибо! – FGOG

Смежные вопросы