选择相同外部元素类型的内部元素

时间:2014-12-23 16:32:59

标签: jsoup

使用:

doc.select("table#mainTable table#newTable table")

不起作用:

doc.select("table#mainTable table#newTable").select("table")

给定一个元素,例如doc.select("table#mainTable table#newTable"),如何迭代所有嵌套的<table/>?我刚刚把table#newTable还给了我。

1 个答案:

答案 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"));
    }
}