根据行数据从表行中提取值 - JSoup

时间:2016-02-18 17:47:57

标签: java html jsoup

我正在尝试使用JSoup解析HTML文档。我想要做的是提取特定行的表数据。我希望能够使用href属性的值或<a></a>标记的值来选择所述行。

<tbody>
   <tr class="even">
      <td><a href="link-1">Link_1</a></td>
      <td align="center">9</td>
      <td align="center">9</td>
      <td align="center">2</td>
   </tr>
   <tr class="odd">
      <td><a href="link-2">Link_2</a></td>
      <td align="center">22</td>
      <td align="center">4</td>
      <td align="center">1</td>
   </tr>
   <tr class="even">
      <td><a href="link-3">Link_3</a></td>
      <td align="center">22</td>
      <td align="center">7</td>
      <td align="center">1</td>
   </tr>
</tbody>

选择整个表格很简单,我可以使用以下内容:

Document htmlRawData = Jsoup.parse(deviceMetricData.toString());
Elements htmlMetrics = htmlRawData.select("tbody > tr > td[align]");

htmlMetrics.stream().forEach((ele) -> {
   System.out.println(ele.toString());
}); 

当表格有一行时,这是唯一理想的选择。如果它有很多,那么根据第一个单元格的值选择一个特定的行变得更加棘手。

任何人都可以帮助我开始或指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

请记住,可以遍历DOM树。

如果您只知道a内的td内总是存在相同的结构(tr),那么您可以按如下方式进行:

Element link = document.select("tbody > tr > td > a[href=\"link-1\"]").first();
link.parent().parent().children().forEach(System.out::println);

您还可以通过此href值的出现来过滤所有行:

final Elements rows = document.select("tbody > tr");
rows
    .stream()
    .filter(tr -> !tr.getElementsByAttributeValueMatching("href", "link-1").isEmpty())
    .findFirst()
    .map(Element::children)
    .ifPresent(System.out::println);

或者使用select:

final Elements rows = document.select("tbody > tr");
rows
    .stream()
    .filter(tr -> !tr.select("a[href=\"link-1\"").isEmpty())
    .findFirst()
    .map(Element::children)
    .ifPresent(System.out::println);