Проблема с получением информации из html-таблиц в java

#java #android #jsoup

#java #Android #jsoup

Вопрос:

Я хочу получить информацию из первой таблицы внутри этой ссылки на сайт

Это тот код, который у меня есть

 Document document = Jsoup.parse(DownloadPage("http://www.transtejo.pt/clientes/horarios"  
            "-ligacoes-fluviais/ligacao-barreiro-terreiro-do-paco/#dias-uteis"));

    Elements table = document.select("table.easy-table-creator:nth-child(1) tbody");
    Elements trAll = table.select("tr");

    //For the Table Hour
    Elements tr_first = table.select("tr:nth-child(1)");
    Element tr = tr_first.get(1);
    Elements td = tr.getElementsByTag("td");
    for(int i = 0; i < td.size(); i  ) {
        Log.d("TIME TABLE:"," "   td.get(i).text());

        for(int i1 = 1; i1 < trAll.size(); i1  ) {

            Elements td_inside = trAll.get(i1).getElementsByTag("td");
            Log.d("TD INSIDE:"," "   td_inside.get(i).text());


        }



    }
  

Прямо сейчас я могу получить информацию, проблема в том, что я получаю содержимое из других таблиц, потому что имя класса всех таблиц одинаковое, и у меня возникли проблемы с указанием нужной мне таблицы, а также я получаю исключение IndexOutOfBoundsException

Это журнал этой ссылки на журнал

Тип журнала, который я хочу, это что-то вроде этого: Час (ТАБЛИЦА ВРЕМЕНИ), а затем в этот час я хочу получить все итоговые строки с минутами (TD ВНУТРИ) за этот час, а затем перейти к следующему часу (…)

Спасибо за потраченное время.

[РЕДАКТИРОВАТЬ] Лучший пример журнала Проверьте первую таблицу.

 TIME TABLE: 05H
TD INSIDE: 15
TD INSIDE: 45
TIME TABLE: 06H
TD INSIDE: 15
TD INSIDE: 35
TD INSIDE: 45
TD INSIDE: 55
TIME TABLE: 07H
TD INSIDE: 05
TD INSIDE: 15
TD INSIDE: 20
TD INSIDE: 25
TD INSIDE: 35
TD INSIDE: 40
TD INSIDE: 50
TD INSIDE: 55
  

(…)

Комментарии:

1. Привет, ты можешь четко записать ожидаемый журнал?

2. Привет, я отредактировал вопрос с типом журнала, который я ожидаю! Спасибо

Ответ №1:

Вы можете это сделать:

 Element table = document
  .select("table.easy-table-creator:nth-child(1) tbody").first();
Elements trAll = table.select("tr");
Elements trAllBody = table.select("tr:not(:first-child)");

// For the Table Hour
Element trFirst = trAll.first();
Elements tds = trFirst.select("td");
for(int i = 0; i < tds.size(); i  ){
    Element td = tds.get(i);
    Log.d("TIME TABLE:", " "   td.text());

    String query = "td:nth-child("   (i   1)   ")";
    Elements subTds = trAllBody.select(query);
    for (int j = 0; j < subTds.size(); j  ) {
        Element subTd = subTds.get(j);
        String tdText = subTd.text();
        if(!tdText.isEmpty()){                  
            Log.d("TD INSIDE:", " "   subTd.text());
        }
    }
}
  

Некоторые интересные моменты:

  • ваш table.easy-table-creator:nth-child(1) tbody селектор выбирал все таблицы на странице;
  • с помощью прогрессивного выбора вы можете получить все td значения в заданном столбце: td:nth-child(index) ;
  • trAllBody здесь содержатся все tr файлы, которые не являются первыми (с использованием tr:not(:first-child) селектора).

Комментарии:

1. Большое спасибо!! очень разумно использовать tr: not(:first-child)