jsoup getelementsbytag仅在层次结构中获取高级别的html元素

时间:2013-06-30 06:21:57

标签: java jsoup

我必须从一个我无法改变的网站解析一些HTML。我正在使用Jsoup。

这是一些html:

<th></th>
<td> <!-- <td> tags on a high level in the hierarchy. -->
  <table>
    <tbody>
       <tr>
         <td></td> <!-- <td> tags on a low level in the hierarchy. -->
         <td></td>
         <td></td>
       </tr>
    </tbody>
  </table>
</td>
<td></td>
<td></td>

我想elementname.getElemementsByTag("td");,但此方法会获取所有<td>个标记,但我只想在层次结构中的高层获取<td>标记,并跳过层次结构中的较低级别。有谁知道怎么做?

感谢所有帮助。

2 个答案:

答案 0 :(得分:3)

Jsoup允许您通过document.selector("CSS SELECTOR")通过CSS选择器获取元素。

如果您想要td的直接table孩子,可以使用CSS selector >, which means direct children。那么,对于你的情况,你应该使用:

#tableID > tbody > tr > td

这可以获得td #tableID的所有第一级table。有些事情需要注意:

  • 在中间包含> tbody > tr。即使您的原始HTML标记没有它们,Jsoup也会在解析HTML时创建它们。
  • 您不需要在第一部分拥有ID。你可以有任何东西。例如,所有tdtable的所有第一级.pretty,其中table.pretty > tbody > tr > td类:Elements tds = document.select("#tableID > tbody > tr > td");

在Jsoup中:

  • Element myTable = document.select("#tableID")
  • 或者,如果您想先选择表格(或之前选择过表格):
    • Elements tds = myTable.select(" > tbody > tr > td");
    • TD;

最后但并非最不重要的是,从您的示例中获取import org.jsoup.Jsoup; import org.jsoup.nodes.*; import org.jsoup.select.*; public class JsoupHtmlDirectChildren { public static void main(String[] args) { String html = "" + "<html> " + " <body> " + " <span>HELLO!</span> " + " <table id=\"myTable\"> " + " <tbody> " + " <tr> " + " <th>header</th> " + " <!-- <td> tags on a high level in the hierarchy. --> " + " <td>high level1 " + " <table> " + " <tbody> " + " <tr> " + " <!-- <td> tags on a low level in the hierarchy. --> " + " <td>low level1</td> " + " <td>low level2</td> " + " <td>low level3</td> " + " </tr> " + " </tbody> " + " </table> " + " </td> " + " <td>high level2</td> " + " <td>high level3</td> " + " </tr> " + " </tbody> " + " </table> " + " </body> " + "</html> "; Document doc = Jsoup.parse(html); // all first level children TD of the #myTable table Elements highLevelTDs = doc.select("#myTable > tbody > tr > td"); System.out.println("QUANTITY FOUND: "+highLevelTDs.size()); for (Element td : highLevelTDs) { System.out.println("\n\n###HIGH LEVEL TD: "+td); } } } 的示例代码:

QUANTITY FOUND: 3

###HIGH LEVEL TD: <td>high level1 
 <table> 
  <tbody> 
   <tr> 
    <!-- <td> tags on a low level in the hierarchy. --> 
    <td>low level1</td> 
    <td>low level2</td> 
    <td>low level3</td> 
   </tr> 
  </tbody> 
 </table> </td>

###HIGH LEVEL TD: <td>high level2</td>

###HIGH LEVEL TD: <td>high level3</td>

输出:

{{1}}

答案 1 :(得分:0)

我希望您所查看的网站具有详细的HTML标记,而不是您在此处向我们展示的标记。

如果你的标签有描述符,例如类或ID或其他属性,它们可用于过滤你感兴趣的相应Elements

例如。要获得类属性为“high”的所有<td>元素,您可以执行以下操作。

Elemenets highTDElements = rootElementName.select("td.high");

official site上提供了有关选择器语法的更多详细信息,但只有在存在属性/ ID /类等描述符时才会有用。

否则你受到DOM遍历的限制,你应该知道元素的确切位置。