2013-10-18 28 views
0

我正在使用XPath提取DOM元素值。 由於XPath不一致,我使用了一些通配魔術來選擇同一級別上的所有DOM元素。用於HTML的XPath通配符

例XPath的HTML文檔中:

//div[@id='floatswrap']/div/div[2]/div[1] 
//div[@id='floatswrap']/div/div[2]/div[2] 
//div[@id='floatswrap']/div/div[2]/div[3] 
...... 
//div[@id='floatswrap']/div/div[2]/div[100] 

我已經試過*/div[@id='floatswrap']/div/div[2]/div通配符(注意開頭的星號字符,沒有方括號在年底),但它失敗。 所以我使用以下(上面的示例代碼): //div[@id='floatswrap']/div/div[2]/div[*](注意括號內的星號),現在就開始炒作了。

由於我是XPath新手,是否有更好更一致的方式使用通配符來選擇XPath節點?

編輯: 假設我有以下HTML:

<html> 
<head> 
</head> 
    <body> 
     <div id="floatswrap"> 
     <div> 
     <div>First</div> 
     <div>      <!-- SELECT ALL DIV NODES WRAPPED IN THIS DIV --> 
      Second 

      <div>One</div>      <!-- SELECT THIS NODE --> 
      <div>Two</div>      <!-- SELECT THIS NODE --> 
      <div>Three</div>     <!-- SELECT THIS NODE --> 
      <!-- ........ -->     <!-- SELECT ALL DIV NODES --> 
      <div>Hundred</div>     <!-- SELECT THIS NODE --> 
     </div> <!-- ./Second DIV --> 
     </div> 
     <div> Some Text </div>   
     <div> Some Other Text </div> 
     </div> <!-- ./floatswrap --> 
    </body> 
</html> 

我想選擇第二個DIV的所有div。

+0

ID都是唯一的,所以期運用'// DIV [@id = ... ]'是合理的。沒有任何示例輸入,可以對後續內容進行進一步評論。請至少發佈整個div,以及預期的產出。 –

+0

我在這裏試圖完成的是在特定DOM節點下定義爲XPath字符串的DOM節點上進行迭代。 – dede

+0

但通過使用通配符。我可以使用其他環境或使用CSS選擇器來完成此任務,但在XPath級別上這樣做似乎要快得多,並且有可能在運行時動態定義它。 – dede

回答

0

如果您不給出任何謂詞,則不會應用額外的過濾器(但對於元素名稱,此處爲div)。 div[*]實際上不是正好正在做你所需要的;它只選擇其他子節點的div。

這將選擇所有div的,你想有:

//div[@id='floatswrap']/div/div[2]/div 

你可能要一個位置謂詞添加到第二軸步,如果返回太多:

//div[@id='floatswrap']/div[1]/div[2]/div 

進一步簡化似乎不可能;你也許可以只選擇div的不含有其他元素,但我不認爲這是任何方式更好:

//div[@id='floatswrap']//div[not(*)]