我必须从一个我无法改变的网站解析一些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>
标记,并跳过层次结构中的较低级别。有谁知道怎么做?
感谢所有帮助。
答案 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时创建它们。td
个table
的所有第一级.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遍历的限制,你应该知道元素的确切位置。