当前位置: 首页 > 面试题库 >

使用JSoup从表中提取数据

鞠泰平
2023-03-14
问题内容

我想使用JSoup-framework提取此表,以将内容保存在“表”数组中。第一个tr-tag是表头。所有以下内容(不包括在内)均描述了内容。

<table style=h2 width=100% cellspacing="0" cellpadding="4" border="1" bgColor="#FFFFFF">
<tr>
<td align="left" bgcolor="#9999FF" >
<!-- 0 -->
Kl.
</td>
<td align="left" bgcolor="#9999FF" >
<!-- 3 -->
Std.
</td>
<td align="left" bgcolor="#9999FF" >
<!-- 4 -->
Lehrer
</td>
<td align="left" bgcolor="#9999FF" >
<!-- 5 -->
Fach
</td>
<td align="left" bgcolor="#9999FF" >
<!-- 6 -->
Raum
</td>
<td align="left" bgcolor="#9999FF" >
<!-- 7 -->
VLehrer
</td>
<td align="left" bgcolor="#9999FF" >
<!-- 8 -->
VFach
</td>
<td align="left" bgcolor="#9999FF" >
<!-- 9 -->
VRaum
</td>
<td align="left" bgcolor="#9999FF" >
<!-- 13 -->
Info
</td>
</tr>
<tr>
<!-- 1 0 -->
<td align="left" bgcolor="#FFFFFF" >
&nbsp;
</td>
<!-- 1 3 -->
<td align="left" bgcolor="#FFFFFF" >
4
</td>
<!-- 1 4 -->
<td align="left" bgcolor="#FFFFFF" >
Méta
</td>
<!-- 1 5 -->
<td align="left" bgcolor="#FFFFFF" >
HU
</td>
<!-- 1 6 -->
<td align="left" bgcolor="#FFFFFF" >
&nbsp;
</td>
<!-- 1 7 -->
<td align="left" bgcolor="#FFFFFF" >
Shne
</td>
<!-- 1 8 -->
<td align="left" bgcolor="#FFFFFF" >
&nbsp;
</td>
<!-- 1 9 -->
<td align="left" bgcolor="#FFFFFF" >
&nbsp;
</td>
<!-- 1 13 -->
<td align="left" bgcolor="#FFFFFF" >
&nbsp;
</td>
</tr>

我已经测试了这一个和其他一些,但是我没有让它们为我工作:
使用JSoup提取HTML表内容


问题答案:

这是一些示例代码,您如何仅选择标题:

Element tableHeader = doc.select("tr").first();


for( Element element : tableHeader.children() )
{
    // Here you can do something with each element
    System.out.println(element.text());
}

你得到Document

  1. 解析 文件Document doc = Jsoup.parse(f, null);(这里fFilenull字符集,请参阅jsoup对铁道部的相关信息文件

  2. 解析 网站 :(Document doc = Jsoup.connect("http://your.url.here").get();不要错过http://

输出:

Kl.
Std.
Lehrer
Fach
Raum
VLehrer
VFach
VRaum
Info

现在,如果需要List所有条目的数组(或更好的数组),则可以创建一个新类,用于存储每个条目的所有信息。接下来,您通过jsoup解析HTML,并填充该类的所有字段并将其添加到列表中。

// Note: all values are strings - you'll need to use better types (int, enum whatever) here. But for an example its enough.
public class Entry
{
    private String klasse;
    private String stunde;
    private String lehrer;
    private String fach;
    private String raum;
    private String vLehrer;
    private String vFach;
    private String vRaum;
    private String info;


    // constructor(s) and getter / setter

    /*
     * Btw. it's a good idea using two constructors here: one with all arguments and one empty. So you can create a new instance without knowing any data and add it with setter-methods afterwards.
     */
}

接下来,代码将填充您的条目(包括存储它们的列表):

List<Entry> entries = new ArrayList<>();        // All entries are saved here
boolean firstSkipped = false;                   // Used to skip first 'tr' tag


for( Element element : doc.select("tr") )       // Select all 'tr' tags from document
{
     // Skip the first 'tr' tag since it's the header
    if( !firstSkipped )
    {
        firstSkipped = true;
        continue;
    }

    int index = 0;                              // Instead of index you can use 0, 1, 2, ...
    Entry tableEntry = new Entry();
    Elements td = element.select("td");         // Select all 'td' tags of the 'tr'

    // Fill your entry
    tableEntry.setKlasse(td.get(index++).text());
    tableEntry.setStunde(td.get(index++).text());
    tableEntry.setLehrer(td.get(index++).text());
    tableEntry.setFach(td.get(index++).text());
    tableEntry.setRaum(td.get(index++).text());
    tableEntry.setvLehrer(td.get(index++).text());
    tableEntry.setvFach(td.get(index++).text());
    tableEntry.setInfo(td.get(index++).text());

    entries.add(tableEntry);                    // Finally add it to the list
}

如果您在第一篇文章中使用html,则会得到以下输出:

[Entry{klasse= , stunde=4, lehrer=Méta, fach=HU, raum= , vLehrer=Shne, vFach= , vRaum=null, info= }]

注意:
我只是用于System.out.println(entries);此目的。因此,输出的格式来自的toString()方法Entry

请参阅Jsoup文档,尤其是有关jsoup选择器api的文档。



 类似资料:
  • 当我试图从在线URL=forexalgerie.com中的表中获取数据时,我的目标是这些值: ...似乎我的代码一切正常: 但是结果包含表中的所有内容,除了我想要的值? 怎么了?

  • 我有一个带有ID、TEXT等列的表,这里的TEXT是超文本标记语言FORMAT中包含数据的Clob列 样本数据: 当我使用Jsoup.parse(AUDIT_SCOPE_LOB.text()时;我得到的数据如下 我对java知之甚少。我可以使用jsoup获取java代码来提取数据并重新运行下面的outpu吗 实际上,这个数据是一个样本数据。我有一些带有html标记的数据,这里没有提到。

  • 我一直在研究用于数据提取的Jsoup示例,并提取了此链接的一个示例 J汤

  • 所以我尝试从pretag获取数据,我设置doc连接到url选择pretag,结果出错了,我需要获取的数据按这里

  • 需要从以下来源提取信息: 试过: 得到0个结果。问题只出在跨类上。JSOUP 1.7.2。

  • 你好,我需要我下面的代码的解决方案。我试图从跨度类中提取文本,但似乎所有的文本都在同一时间提取,这样我就可以一个接一个地提取文本。 JAVA代码 超文本标记语言输出 JAVA输出 独处的年龄令人惊叹的愤怒周年纪念建筑艺术态度美丽最好的生日聪明的商务车机会改变圣诞节通信计算机酷勇气爸爸约会死亡设计饮食梦想复活节教育环境平等经历失败信仰家庭著名的父亲节恐惧金融健身食物宽恕自由友谊有趣的未来园艺上帝好政