Разбор конкретной таблицы в массив строк Jsoup - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть это, довольно сложный HTML, я хочу проанализировать с помощью JSoup.Я пробовал несколько вещей, но ничего не работает.По сути, я хотел получить вторую таблицу, прочитать все строки и добавить ее в строку.

Что я пробовал

val document = Jsoup.parse(it.data)

                val tableElements = document.select("table:eq(2) > tbody")
                for (element in tableElements) {
                    val data = element.select("td")
                    try {
                        Timber.i("${data[0].select("small").text()} : ${data[1].select("small").text()}")
                    } catch (e: Exception) {
                    }
                }

Какая частьЯ хочу извлечь

<table>
  <tbody>
    <tr class="">
      <td class="odsazena" align="left"><small>User's identification number: </small></td>
      <td class="odsazena" align="left"><small>34565</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Study programme: </small></td>
      <td class="odsazena" align="left"><small>Informatics</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Type of study: </small></td>
      <td class="odsazena" align="left"><small>Bachelor</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Form of study: </small></td>
      <td class="odsazena" align="left"><small>full-time, attendance method</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Standard length of study: </small></td>
      <td class="odsazena" align="left"><small>3</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Number of credits required to complete your study: </small></td>
      <td class="odsazena" align="left"><small>180</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Number of credits enrolled for the whole study: </small></td>
      <td class="odsazena" align="left"><small>120</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Number of credits obtained during your whole course of study: </small></td>
      <td class="odsazena" align="left"><small>90</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Your prospective academic degree: </small></td>
      <td class="odsazena" align="left"><small>Bc.</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Beginning of study: </small></td>
      <td class="odsazena" align="left"><small>09/01/2017</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Resolution of admission: </small></td>
      <td class="odsazena" align="left"><small>Admitted without the entrance exam</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Progress of study: </small></td>
      <td class="odsazena" align="left"><small>enrolled</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Mode of completion: </small></td>
      <td class="odsazena" align="left"><small><i>not stated</i></small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Current financing: </small></td>
      <td class="odsazena" align="left"><small>study fully financed from ME SK</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Final thesis topic: </small></td>
      <td class="odsazena" align="left"><small><i>not stated</i></small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Final thesis supervisor: </small></td>
      <td class="odsazena" align="left"><small><i>not stated</i></small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Language of study: </small></td>
      <td class="odsazena" align="left"><small>Slovak</small></td>
    </tr>
    <tr class="">
      <td class="odsazena" align="left"><small>Card number:</small></td>
      <td class="odsazena" align="left"><small>123456</small></td>
    </tr>
  </tbody>
</table>

А теперь, в чем конкретно проблема?Из того, что я пробовал, код даже не позволяет мне печатать то, что я хочу, и в текущем состоянии он просто пропустит цикл for.Чего я хотел добиться, так это того, что я хотел попасть во вторую таблицу «table: eq (2)» и получить элементы внутри «tbody»

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Это код Java, чтобы делать то, что вы хотите.Вы можете применить селектор на элементы.

@Test
public void selectSecondTable() {

    String html = "" +
            "<table></table>" +
            "<table>\n" +
            "  <tbody>\n" +
            "    <tr class=\"\">\n" +
            "      <td class=\"odsazena\" align=\"left\"><small>User's identification number: </small></td>\n" +
            "      <td class=\"odsazena\" align=\"left\"><small>34565</small></td>\n" +
            "    </tr>\n" +
            "  </tbody>\n" +
            "</table>";

    Document doc = Jsoup.parse(html);
    //select tr from second table in document:
    for (Element e : doc.select("table:eq(1) tr")) {
        //for each table row select text from small tag and print to console:
        System.out.println(e.select("small").text());
    }

}
0 голосов
/ 14 февраля 2019

Я думаю, что вы должны также выбрать элементы "tr" и перебрать их так, как будто вы перебираете "tbody".Это решение в Java, так как я не знаю синтаксис Kotlin, но, возможно, это поможет:

Elements tableElements = doc.select("table").get(1).select("tbody").select("tr");
for (Element element : tableElements) {
    Elements data = element.select("td");
    System.out.println(data.select("small").first().text() +" : "
    + data.select("small").last().text());  
}
...