如何使用Jsoup读取HTML表

时间:2016-04-03 21:49:29

标签: java jsoup

我正在尝试使用here

中的城市阅读表格

基本我想要所有的城市名称,但我被困在我遍历到桌子内部的部分。

选择代码。

 Element table = rawCities.getElementById("content")
                 .getElementById("bodyContent")
                 .getElementById("mw-content-text")
                 .select("table.wikitable sortable jquery-tablesorter").first()
                 `.select("tbody").first()`;

因此,在另一个类中使用Jsoup.connect下载和解析文档,在这里我试图获取城市名称。当我遍历选择时,我在这里得到一个NullPointerException。如果我摆脱.select("tbody").first() 程序运行但调试器显示表变量null。我应该以其他方式这样做,还是我弄错了?

1 个答案:

答案 0 :(得分:2)

如果您打印rawCities,您很可能找不到任何代表标记<jquery-tablesorter>的元素。因此,您应该从select中删除它。

另一个问题是table.wikitable sortable会尝试查找

<table class="wikitable">
  ...
    <sortable>
  ...
</table>

<table class"wikitable sortable">...

要查找包含少量类的元素,请在每个类名之前使用.运算符,例如element.class1.class2而不是 space (描述祖先 - 子关系)element.class1 class2。< / p>

所以你的代码可以简化为

Element table = rawCities
        .select("table.wikitable.sortable tbody")
        .first();

无论如何,如果您只想打印所选表格第一列的内容,可以使用

进行
for (Element row : rawCities.select("table.wikitable.sortable td:eq(0) a")) {
    System.out.println(row.text());
}

您可以使用此循环将row.text()的结果添加到之前创建的某些List<String>或使用

等代码
List<String> names = rawCities
        .select("table.wikitable.sortable td:eq(0) a")
        .stream()
        .map(e -> e.text())
        .collect(Collectors.toList());