【问题标题】:Using JSOUP to print specific rows使用 JSOUP 打印特定行
【发布时间】:2014-05-05 10:52:56
【问题描述】:

我想从给定表格的特定行中提取文本,例如:

<table>
   <th> head1 </th>
   <th> head2 </th>
   <tr> <td> cell1 </td> <td> cell2 </td> </tr>
   <tr> <td> cell3 </td> <td> cell4 </td> </tr>
</table>

通过在 Java 中使用 Jsoup,如何仅提取该表中第 1 行的内容。所需的输出如下:

cell1, cell2 

我尝试了以下代码,但它打印了我不喜欢的标题行:

    Element table = doc.getElementsByTag("table").first();
    Elements trs = table.getElementsByTag("tr");
    for (Element tr : trs) {
        for (Element td : tr.getAllElements()) {
            System.out.println("TD: " + td.text());
             ....

【问题讨论】:

    标签: java web-scraping html-table jsoup row


    【解决方案1】:

    试试这个方法:

    Elements tdsInSecondRow = doc.select("table tr:eq(1) > td");
    for (Element td : tdsInSecondRow)
    {
        System.out.println("TD: " + td.text());
    }
    

    为了理解选择器,请允许我将其分为 3 个部分:

    1. 表格 - 选择表格
    2. tr:eq(1) - 从中​​选择第二个(0-indexed)tr
    3. > td - 并从中选择 td,它们是 tr 的直接子代

    要使其使用循环工作,请设置一个布尔标志或计数器以确定执行何时在循环的第一次迭代中,并在这种情况下继续,如下所示:

    boolean isFirstIteration = true;
    for (Element tr : trs) {
        if (isFirstIteration) {
            isFirstIteration = false;
            continue;
        }
        else {
            for (Element td : tr.getAllElements()) { ... }
        }
     }
    

    如果您使用计数器,则可以每 2 行或 3 行取一次。

    【讨论】:

    • 您可以使用:nth-child(an+b) 选择器而不是计数器来选择每个an+bth 元素。所以“从第二行开始的每第三行”是:nth-child(3n+1)
    猜你喜欢
    • 2021-12-30
    • 1970-01-01
    • 2011-04-03
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多