我正在尝试使用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());
});
当表格有一行时,这是唯一理想的选择。如果它有很多,那么根据第一个单元格的值选择一个特定的行变得更加棘手。
任何人都可以帮助我开始或指出我正确的方向吗?
答案 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);