使用Jsoup

时间:2016-01-24 16:29:20

标签: java html parsing jsoup

我正在使用.html解析Jsoup文件。
我有一个<tr>标签。

<tr>标记包含以下内容:

<tr height="40" align="center"> 
    <td class="small" style="padding-top: 5px;" bgcolor="#f1f1f1"><strong>Data1</strong><span class="small1"><br>time1</span></td> 
    <td align="center" class="small">&nbsp;</td> 
    <td align="center" class="small">&nbsp;</td> 
    <td align="center" class="small" bgcolor="#eeeeee" rowspan="2">&nbsp;</td> 
    <td align="center" class="small">&nbsp;</td> 
    <td align="center" class="small">&nbsp;</td> 
    <td align="center" class="small" bgcolor="#eeeeee" rowspan="2">&nbsp;</td> 
    <td align="center" class="small">&nbsp;</td> 
    <td class="small" style="padding-top: 5px;" bgcolor="#eeeeee" rowspan="2"><strong>Data2</strong><span class="small1"><br>time2</span></td> 
</tr>



我需要上面的每个<td>标签。
所以,我使用Elements.selector()尝试了这样的代码:

String str;
int size;
// ...
Elements elems;    // it has <tr> tag above.
// ...
str = elems.select("td").toString();
size = elems.select("td").size();



所以我认为现在size应为9str应低于以下值:

<td class="small" style="padding-top: 5px;" bgcolor="#f1f1f1"><strong>Data1</strong><span class="small1"><br>time1</span></td> 
<td align="center" class="small">&nbsp;</td> 
<td align="center" class="small">&nbsp;</td> 
<td align="center" class="small" bgcolor="#eeeeee" rowspan="2">&nbsp;</td> 
<td align="center" class="small">&nbsp;</td> 
<td align="center" class="small">&nbsp;</td> 
<td align="center" class="small" bgcolor="#eeeeee" rowspan="2">&nbsp;</td> 
<td align="center" class="small">&nbsp;</td> 
<td class="small" style="padding-top: 5px;" bgcolor="#eeeeee" rowspan="2"><strong>Data2</strong><span class="small1"><br>time2</span></td> 



但是,当我编译这段代码时,
size4str如下:

<td class="small" style="padding-top: 5px;" bgcolor="#f1f1f1"><strong>Data1</strong><span class="small1"><br>time1</span></td>
<td align="center" class="small">&nbsp;</td>
<td align="center" class="small" bgcolor="#eeeeee" rowspan="2">&nbsp;</td>
<td class="small" style="padding-top: 5px;" bgcolor="#eeeeee" rowspan="2"><strong>Data2</strong><span class="small1"><br>time2</span></td>



我认为删除了重复的<td>代码...
我不明白。我需要所有<td>个标签。
我有什么不对吗?

2 个答案:

答案 0 :(得分:1)

当您在select("td")(复数)上Elements暂停tr时,会出现问题/错误,但当您可以Element(单数)时,它会消失代表单tr

因此,如果您只有一个tr,则只需选择first() Elementselect("td")即可。

str = elems.first().select("td").toString();
size = elems.first().select("td").size();

如果tr迭代所有这些,例如

for (Element tr : elems){
   //^^^^^^^^^^ - element holding single tr
    Elements tds = tr.select("td");
    System.out.println(tds);
    System.out.println("---------");
    System.out.println(tds.size());  
}

当我们拨打select("tr td")而非select("tr").select("td")时,问题也会消失(在这两种情况下,我们都会尝试从所有td中选择所有tr)。

答案 1 :(得分:0)

On https://blog.tallan.com/2012/07/26/parsing-html-using-jsoup-library/是一种获取表格所有行的方法:

Document doc = Jsoup.connect("http://en.wikipedia.org/wiki/List_of_blogs").get();

[...]

Elements trs = doc.select("table.wikitable tr");

表意味着我们要“选择一个表”,。表示'使用CSS类命名',wikitable实际上标识了我们正在寻找的CSS类, 和'tr'表示'然后获取后面的所有表行。'

这里是大多数选择器的概述: http://jsoup.org/cookbook/extracting-data/selector-syntax