java - 如何使用 Jsoup 读取 HTML 表格

标签 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() 程序运行但调试器显示表变量为空。我应该以其他方式这样做还是我做错了什么?

最佳答案

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

另一个问题是table.wikitable sortable将尝试寻找

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

不是

<table class"wikitable sortable">...

要查找具有很少类的元素,请使用 .每个类名之前的运算符,如 element.class1.class2不是空间(描述祖先- child 关系)element.class1 class2 .

所以你的代码可以简化为

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());

关于java - 如何使用 Jsoup 读取 HTML 表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36391634/

相关文章:

java - Jsoup.connect(url).get() 仅返回一半的代码

java - 如何提取在网页 JSoup 中找到的所有文本

java - 如何将当前元素嵌入到新元素中并使用 jsoup 更新到文档中

java - 为什么不在 HashCode() 方法中使用非final字段来生成hashCode

java - 尝试插入最大值时,有序链表给出空指针

java - BIRT 在运行时找不到包含本地化的 .properties 文件(servlet)

java - 运行/调试配置以红色突出显示普通应用程序的选定主类

java - 使用 owasp-java-html-sanitizer 嵌入 CSS

java - 在 Android 中解析一些 HTML 代码的最佳方法

java - 更改 Servlet 发布位置?