Java 使用JSOUP打印特定行

Java 使用JSOUP打印特定行,java,web-scraping,html-table,jsoup,row,Java,Web Scraping,Html Table,Jsoup,Row,我想从给定表中的特定行中提取文本,例如: <table> <th> head1 </th> <th> head2 </th> <tr> <td> cell1 </td> <td> cell2 </td> </tr> <tr> <td> cell3 </td> <td> cell4 </td

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

<table>
   <th> head1 </th>
   <th> head2 </th>
   <tr> <td> cell1 </td> <td> cell2 </td> </tr>
   <tr> <td> cell3 </td> <td> cell4 </td> </tr>
</table>
我尝试了以下代码,但它打印了我不喜欢的标题行:

    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());
             ....
试着这样做:

Elements tdsInSecondRow = doc.select("table tr:eq(1) > td");
for (Element td : tdsInSecondRow)
{
    System.out.println("TD: " + td.text());
}
为了理解选择器,请允许我将其分为3个部分:

  • 表格-选择表格
  • tr:eq(1)-从中选择第二个(0索引)tr
  • >td-并从中选择作为tr直接子项的tds
  • 要使其使用循环工作,请设置布尔标志或计数器以确定何时在循环的第一次迭代中执行,并在该情况下继续,如中所示:

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

    如果使用计数器,则可以每隔第二行或第三行取一个。

    而不是计数器,可以使用
    :n子元素(an+b)
    选择器选择每个
    an+b
    th元素。因此,“从第二行开始的每三行”是
    :第n个子(3n+1)
    boolean isFirstIteration = true;
    for (Element tr : trs) {
        if (isFirstIteration) {
            isFirstIteration = false;
            continue;
        }
        else {
            for (Element td : tr.getAllElements()) { ... }
        }
     }