![](/img/trans.png)
[英]How to select an element with specific text from the HTML a element using JSoup
[英]Jsoup select element at depth (DOM level from parents)
以下是一些原始HTML
(摘自大文件):
<h1 class="contentHeader">This is the header</h1>
使用JSoup的traverse
方法,我traverse
了DOM並找到了該元素及其屬性,即:
doc.traverse(new NodeVisitor() {
@Override
public void head(Node node, int depth) {
System.out.println(node);
System.out.println("Node depth: " + depth);
Attributes attrList = node.attributes();
for (Attribute attr: attrList) {
System.out.println(attr);
}
....
}
這將產生:
<h1 class="contentHeader">This is the header</h1>
Node depth: 8
class="contentHeader"
我現在想做的是編寫一個單行實現來查找此元素。 我一直在閱讀《 JSoup Cookbook》 ,似乎可以通過使用eq
選擇器指定深度來實現,但是我沒有運氣。 我能想到的最好的方法是:
System.out.println(doc.select("h1.contentHeader:eq(8)"));
但這不會輸出任何數據。 我或者缺少一些關鍵的東西,誤解了API,或者只是犯了錯誤。
任何意見或建議將不勝感激。
eq
是CSS的偽類/選擇器,不用於按深度選擇。 這是關於eq
的正確解釋:
與索引相關的選擇器(
:eq()
:lt()
:gt()
:odd
:even
,:odd
)過濾與前面的表達式匹配的元素集。 他們根據此匹配集中的元素順序縮小范圍。 例如,如果首先使用類選擇器(.myclass
)選擇元素並返回四個元素,則出於這些選擇器的目的,這些元素的索引為0
到3
。請注意,由於JavaScript數組使用基於0的索引 ,因此這些選擇器反映了這一事實。 這就是為什么
$( ".myclass:eq(1)")
選擇類為myclass
的文檔中的第二個元素,而不是第一個元素。 相反,:nth-child(n)
使用基於1的索引來符合CSS規范。
因此, eq
與深度無關。
但是,如果您的HTML具有class
屬性,為什么不使用它:
System.out.println(doc.select("h1.contentHeader"));
您還可以為此節點編寫一個極其后代的選擇器 (這只是一個示例,因為我不知道您的HTML結構):
System.out.println(doc.select("body div .someClass div div h1.contentHeader"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.