我想用JSoup框架提取此表,以将内容保存在“table”-array中。第一个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" >
</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" >
</td>
<!-- 1 7 -->
<td align="left" bgcolor="#FFFFFF" >
Shne
</td>
<!-- 1 8 -->
<td align="left" bgcolor="#FFFFFF" >
</td>
<!-- 1 9 -->
<td align="left" bgcolor="#FFFFFF" >
</td>
<!-- 1 13 -->
<td align="left" bgcolor="#FFFFFF" >
</td>
</tr>
我已经测试了这个和其他一些,但我没有让他们为我工作: Using JSoup To Extract HTML Table Contents
答案 0 :(得分:2)
以下是一些示例代码,您只能选择标题:
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
...
解析文件:Document doc = Jsoup.parse(f, null);
(其中f
是File
和null
字符集,请参阅jsoup文档了解mor infos)
解析网站: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
方法。