JSoup 解析器没有拾取表格元素

Posted

技术标签:

【中文标题】JSoup 解析器没有拾取表格元素【英文标题】:JSoup parser not picking up table element 【发布时间】:2022-01-05 04:43:49 【问题描述】:

JSoup 在这里。我有以下 html

<html><head>
<title>My Soup Materials</title>
<!--mstheme--><link rel="stylesheet" type="text/css" href="../../_themes/ice/ice1011.css"><meta name="Microsoft Theme" content="ice 1011, default">
</head>
<body><center><table ><tbody>
<tr>
<td><h2>My Soup Materials</h2>

<table  cellspacing="0" cellpadding="0">

<tbody>
<tr>
<td align="left"><b>Origin:</b> Belgium</td>
<td align="left"><b>Count:</b> 2 foos</td>
</tr>

<tr>
<td align="left"><b>Supplier:</b> </td>
<td align="left"><b>Must Burninate:</b> Yes</td>
</tr>

<tr>
<td align="left"><b>Type:</b> Fizzbuzz</td>
<td align="left"><b>Add Afterwards:</b> No</td>
</tr>

</tbody>
</table>
<br>
<b><u>Notes</b></u><br>Drink more ovaltine</td>
</tr>

</tbody>
</table>
</center></body>
</html>

当我运行这段代码时:

String htmlString = "<html><head><title>My Soup Materials</title><!--mstheme--><link rel=\"stylesheet\" type=\"text/css\" href=\"../../_themes/ice/ice1011.css\"><meta name=\"Microsoft Theme\" content=\"ice 1011, default\"></head><body><center><table width=\"92%\"><tbody><tr><td><h2>My Soup Materials</h2><table width=\"100%%\" cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td align=\"left\"><b>Origin:</b> Belgium</td><td align=\"left\"><b>Count:</b> 2 foos</td></tr><tr><td align=\"left\"><b>Supplier:</b> </td><td align=\"left\"><b>Must Burninate:</b> Yes</td></tr><tr><td align=\"left\"><b>Type:</b> Fizzbuzz</td><td align=\"left\"><b>Add Afterwards:</b> No</td></tr></tbody></table><br><b><u>Notes</b></u><br>Drink more ovaltine</td></tr></tbody></table></center></body></html>";
Document document = Jsoup.parse(htmlString);
Elements allTables = document.select("table");
Element table = allTables.get(0);

allTables 元素的大小为 0 且为空(没有子元素、没有属性等)。所以当我去拿第一张桌子时,我得到了一个IndexOutOfBoundsException为什么?我原以为它会有很多孩子,以“&lt;h2&gt;My Soup Materials&lt;/h2&gt;”等开头。

【问题讨论】:

你能提供更多关于你的配置的信息吗?我运行了您的确切代码(4 个 Java 行)并使用最新的 JSoup(1.14.3)检查了 Java 17 中的大小,allTables.size() 返回了2 【参考方案1】:

这可能归结为您的配置或 Java 代码中的某些内容与您的问题不同。我从问题中运行了确切的 4 行 Java 代码,并检查了返回 2allTables.size()

使用 Java 17 和当前最新版本的 JSoup (1.14.3)

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class App 
    public static void main(String[] args) 
        String htmlString = "<html><head><title>My Soup Materials</title><!--mstheme--><link rel=\"stylesheet\" type=\"text/css\" href=\"../../_themes/ice/ice1011.css\"><meta name=\"Microsoft Theme\" content=\"ice 1011, default\"></head><body><center><table width=\"92%\"><tbody><tr><td><h2>My Soup Materials</h2><table width=\"100%%\" cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td align=\"left\"><b>Origin:</b> Belgium</td><td align=\"left\"><b>Count:</b> 2 foos</td></tr><tr><td align=\"left\"><b>Supplier:</b> </td><td align=\"left\"><b>Must Burninate:</b> Yes</td></tr><tr><td align=\"left\"><b>Type:</b> Fizzbuzz</td><td align=\"left\"><b>Add Afterwards:</b> No</td></tr></tbody></table><br><b><u>Notes</b></u><br>Drink more ovaltine</td></tr></tbody></table></center></body></html>";
        Document document = Jsoup.parse(htmlString);
        Elements allTables = document.select("table");
        Element table = allTables.get(0);

        System.out.println(allTables.size()); // prints 2
    

【讨论】:

【参考方案2】:

首先

你的 html 有两个表格

第二

html 表格有部分:标题、正文、行、列等。您需要创建更详细的算法来获取子项

Element table = doc.select("table").get(0); //select the first table.
Elements rows = table.select("tr");

//first row is the col names or header, so skip it.
for (int i = 1; i < rows.size(); i++)  
    Element row = rows.get(i);//get entire row
    Elements cols = row.select("td");//get cols of this row
    //get specific row
    System.out.printl(cols.get(5).text());

【讨论】:

感谢@JRichardsz (+1) 但问题是doc.select("table") 本身是空的(大小= 0),所以doc.select("table").get(0) 抛出java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 请查看我的编辑以获得完全可重现的代码示例。

以上是关于JSoup 解析器没有拾取表格元素的主要内容,如果未能解决你的问题,请参考以下文章

如何从CNBC市场页面解析表格数据?

jsoup 解析HTML信息

HTML&XML解析器--Jsoup

Java 爬虫工具Jsoup解析

Jsoup

JAVA网络爬爬学习之HttpClient+Jsoup