使用:
doc.select("table#mainTable table#newTable table")
不起作用:
doc.select("table#mainTable table#newTable").select("table")
给定一个元素,例如doc.select("table#mainTable table#newTable")
,如何迭代所有嵌套的<table/>
?我刚刚把table#newTable
还给了我。
答案 0 :(得分:0)
选择器没有提供您期望的doc.select("table#mainTable table#newTable").select("table")
的问题是它也包括父表。
示例html
<table id="mainTable">
<tr>
<td>First table</td>
<td>
<table id="newTable">
<tr>
<td>Second table</td>
<td>
<table id="lastone">
<tr>
<td>Third table</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
选择器将返回两个元素 第一个元素是父元素(包含您想要的表)
<table id="newTable">
<tbody>
<tr>
<td>Second table</td>
<td>
<table id="lastone">
<tbody>
<tr>
<td>Third table</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
第二个元素是你需要的元素
<table id="lastone">
<tbody>
<tr>
<td>Third table</td>
</tr>
</tbody>
</table>
不要对示例中缺少的标记感到惊慌,但这些标记会出现在结果中(tbody
)。它们是由jsoup的规范化程序添加的,以便为您提供有关规范的有效html。所以为了得出答案,这个查询doc.select("table#mainTable table#newTable table")
很好。它将返回Elements
,它将包含所有表格元素,这些表格元素是作为子项的newTable
表的子项(无记名,不是必要的直接子项)(同样不一定是直接的)标识为mainTable
的表格。
示例html
<table id="mainTable">
<tr>
<td>First table</td>
<td>
<table id="newTable">
<tr>
<td>Second table</td>
<td>
<table id="lastone_1">
<tr>
<td>Third table</td>
</tr>
</table>
<table id="lastone_2">
<tr>
<td>Third table</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
代码
Document doc = Jsoup.parse(htmlStr);
Elements tables = doc.select("table#mainTable table#newTable table");
int i = 0;
for(Element l : tables) {
System.out.println(i++ + " - " + l.attr("id"));
}
<强>结果强>
0 - lastone_1
1 - lastone_2
<强>更新强>
Document doc = Jsoup.parse(htmlStr);
Elements newTables = doc.select("table#mainTable table#newTable");
for(Element newTable : newTables) {
Elements leafTables = newTable.children().select("table");
for(Element leaf : leafTables) {
System.out.println(leaf.attr("id"));
}
}