Jsoup是一个用于抓取 HTML 页面的开源库。它提供了一个使用 DOM API 方法进行数据解析、提取和操作的 API。
在本文中,我们将了解如何使用 Jsoup 解析 HTML 表。我们将使用 Jsoup 从 HTML 表中检索和更新数据,并添加和删除表中的行。
要使用 Jsoup 库,请将以下依赖项添加到项目中:
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.17.2</version> </dependency>
|
我们可以在 Maven 中央存储库中找到最新版本的Jsoup库。
表结构
为了说明如何通过 jsoup 解析 HTML 表,我们将使用一个示例 HTML 结构。完整的 HTML 结构可在本文末尾提到的 GitHub 存储库中提供的代码库中找到。在这里,我们显示一个仅包含两行数据的表格,用于代表性目的:
<table> <thead> <tr> <th>Name</th> <th>Maths</th> <th>English</th> <th>Science</th> </tr> </thead> <tbody> <tr> <td>Student 1</td> <td>90</td> <td>85</td> <td>92</td> </tr> </tbody> </table>
|
正如我们所看到的,我们正在解析带有带有thead标记的标题行,后跟tbody标记中的数据行的表。我们假设 HTML 文档中的表格采用上述格式。
解析表
首先,要从解析的文档中选择 HTML 表,我们可以使用下面的代码片段:
Element table = doc.select("table");
Elements rows = table.select("tr");
Elements first = rows.get(0).select("th,td");
正如我们所看到的,从文档中选择表元素,然后,为了获取行元素,从表元素中选择tr 。由于表中有多行,因此我们选择了第一行中的th或td元素。通过使用这些函数,我们可以编写以下函数来解析表数据。
在这里,我们假设表中没有使用colspan或rowspan元素,并且第一行带有 header标签。
下面是解析表的代码:
public List<Map<String, String>> parseTable(Document doc, int tableOrder) { Element table = doc.select("table").get(tableOrder); Element tbody = table.select("tbody").get(0); Elements dataRows = tbody.select("tr"); Elements headerRow = table.select("tr") .get(0) .select("th,td"); List<String> headers = new ArrayList<String>(); for (Element header : headerRow) { headers.add(header.text()); } List<Map<String, String>> parsedDataRows = new ArrayList<Map<String, String>>(); for (int row = 0; row < dataRows.size(); row++) { Elements colVals = dataRows.get(row).select("th,td"); int colCount = 0; Map<String, String> dataRow = new HashMap<String, String>(); for (Element colVal : colVals) { dataRow.put(headers.get(colCount++), colVal.text()); } parsedDataRows.add(dataRow); } return parsedDataRows; }
|
在此函数中,参数doc是从文件加载的 HTML 文档,tableOrder是文档中的第 n 个表格元素。我们使用List