簡體   English   中英

深入的Jsoup選擇元素(父級的DOM級別)

[英]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 )選擇元素並返回四個元素,則出於這些選擇器的目的,這些元素的索引為03

請注意,由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM