【问题标题】:Parse specific table to array of strings Jsoup将特定表解析为字符串数组 Jsoup
【发布时间】:2019-02-14 22:15:33
【问题描述】:

我有这个相当复杂的 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”中的元素

【问题讨论】:

    标签: android html kotlin jsoup


    【解决方案1】:

    我认为您也应该选择“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());  
    }
    

    【讨论】:

    • 当然我会尝试的。但是,如果它在文档中是第二个,我该如何选择这个表?
    • 您可以使用.get(index),这样您就可以选择标签的“索引”外观(第一个为0)。我已经修改了我的答案,将其添加到了正确的位置。希望对您有所帮助。
    • 当然,最后一件事,我是否必须跳过嵌套此选项卡的元素?
    • 也许您的代码可以只更改eq(2)eq(1)
    • 如果您使用表格选择器,则无需考虑包含该表格的任何父标记,只要它不是另一个表格即可。通常,HTML 作为 id 属性对于每个元素都是唯一的,因此它们对于搜索元素也很有用(在这种情况下不是)。
    【解决方案2】:

    这是执行您想要的操作的 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开始索引,所以选择第二个表使用table:eq(1)
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多