2015-06-20 2 views
0

Пытается практиковать извлечение данных из таблиц с помощью JSoup. Не могу понять, почему я не могу тянуть поле «акций в обращении» отИзвлечение данных таблицы с помощью JSoup на Yahoo Finance

https://finance.yahoo.com/q/ks?s=AAPL+Key+Statistics

Вот две попытки, где «s» является AAPL:

public class YahooStatistics { 
String sharesOutstanding = "Shares Outstanding:"; 

public YahooStatistics(String s) { 
    String keyStatisticsURL = ("https://finance.yahoo.com/q/ks?s="+s+"+Key+Statistics"); 

//Attempt 1  
    try { 
     Document doc = Jsoup.connect(keyStatisticsURL).get(); 

     for (Element table : doc.select("table.yfnc_datamodoutline1")) { 
      for (Element row : table.select("tr")) { 
       Elements tds = row.select("td"); 
       for (Element td : tds.select(sharesOutstanding)) { 
        System.out.println(td.ownText()); 
       } 
      } 
     } 
    } 
    catch (IOException ex) { 
     ex.printStackTrace(); 
    } 

//Attempt 2 

    try { 
    Document doc = Jsoup.connect(keyStatisticsURL).get(); 

     for (Element table : doc.select("table.yfnc_datamodoutline1")) { 
      for (Element row : table.select("tr")) { 
       Elements tds = row.select("td"); 
       for (int j = 0; j < tds.size() - 1; j++) { 
        Element td = tds.get(j); 
        if ((td.ownText()).equals(sharesOutstanding)) { 
        System.out.println(tds.get(j+1).ownText()); 
        } 
       } 
      } 
     } 
    } 
    catch(IOException ex) { 
     ex.printStackTrace(); 
    } 

вернуться Попытки: BUILD УСПЕШНЫЙ и ничего больше.

Я отключил JavaScript в своем браузере, и таблица все еще отображается, поэтому я предполагаю, что это не написано на JavaScript, а на HTML.

Любые предложения приветствуются.

ответ

3

Заметки о вашем источнике после редактирования:

  • Вы должны сравнить ownText(), а не text(). text() дает вам комбинированный текст всего элемента и всех его подэлементов. В этом случае элемент содержит Shares Outstanding<font size="-1"><sup>5</sup></font>:, поэтому его комбинированный текст "Shares Outstanding5:". Если вы используете ownText, это будет "Shares Outstanding:".
  • Обратите внимание на двоеточие (:). Обновите значение в sharesOutstanding соответственно.
  • Вы передаете ему неправильный URL. Должно быть +, следующее за AAPL.
  • Ваш текущий запрос (по крайней мере, вторая попытка) возвращает элемент дважды, потому что есть вложенная таблица, поэтому он находит TDs дважды.

Вы можете либо выйти из своих циклов, как только найдете совпадение, вернитесь к исходной версии (с исправлениями, как указано выше) - см. Примечание - или вы можете попробовать использовать более сложный запрос, который будет соответствовать только один раз:

Elements elems = doc.select("td.yfnc_tablehead1:containsOwn("+sharesOutstanding+") + td.yfnc_tabledata1"); 

if (! elems.isEmpty()) { 
    System.out.println(elems.get(0).owntext()); 
} 

Этот селектор дает вам все td элементы, класс yfnc_tabledata1, чей непосредственный предшествующим сестринским является td элемент, класс которого является yfnc_tablehead1 и чей собственный текст содержит «акций в обращении:» строка. Это должно в основном выбрать точный TD, в котором вы нуждаетесь.

Примечание: предыдущая версия этого ответа была длинной погрешностью относительно разницы между Elements.select() и Element.select(). Оказывается, я был не прав, и ваша оригинальная версия должна была сработать - если бы вы исправили четыре пункта выше. Поэтому, чтобы установить запись прямо: select() на Elements действительно просматривает каждый элемент, и в результате список может содержать потомки любого из элементов в исходном списке, которые соответствуют выбору. Извини за это.

+0

Спасибо. Я пытаюсь понять, но все еще смущен. В таблице, на которую я ссылаюсь, есть элементы «tr» и «td». Кроме того, когда я пытаюсь просто изменить «Элементы» на «Элемент» выше, я возвращаю «несовместимую ошибку типа». – Nikolas

+0

Сделано редактирование. Надеюсь, я приближаюсь. Я все еще ничего не возвращаю. – Nikolas

+0

Я понимаю разницу в Элементе/Элементах. Удивительное объяснение. ... Сделал еще несколько изменений на основе комментариев и отредактировал объяснение. – Nikolas

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