2014-02-10 50 views
1

我在這裏發佈,希望有專家權衡如何最好地結合不同節點深度的文本值和被索引的文本值。XPath 1.0 - 在不同節點深度選擇文本

我想弄清楚如何從以下兩個語句創建一個XPath 1.0語句。文本值位於不同的深度,第二個語句具有索引文本值。是

這兩個路徑我想結合如下:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/a/text() 
div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/text()[2] 

在此駐留是其中評論海報提供他們的姓名作爲任一種錨(從中接觸)或是上下文只是純文本。

在第一條語句中選擇的文本來自沒有嵌套文本的錨點。在第二條語句中選擇的文本需要索引,因爲相鄰或嵌套的文本存在,因此必須明確提供。

任何有關此事的建議或指導將不勝感激。

謝謝 邁克爾

編輯/後隨

下面的摘錄顯示HTML(只是標籤),但在特定的div類值留下的下調版本。在原來的問題提供的XPath值對應於從li以下項目正在取得XPath查詢:

<html> 
    <body> 
    <div> 
     <div> 
     <div> 
      <ol> 
      <li> 
       <div> 
       <div class="comment-author vcard"> 
        <a>candaceerin</a> 
        <div class="commentmetadata">...</div> 
       </div> 
       </div> 
      </li> 
      <li> 
       <div> 
       <div class="comment-author vcard"> 
        <img/> Rachel 
        <div class="commentmetadata">...</div> 
       </div> 
       </div> 
      </li> 
      </ol> 
     </div> 
     </div> 
    </div> 
    </body> 
</html> 
+2

您能否提供一個兩個配置的示例片段,使其對所有人都更加直觀?根據模式,'div/div // text()'可能會訣竅 – Robin

+0

感謝Robin,我正在評估一個網站來提取客戶端的內容。該網頁是:[鏈接](http://mybrownbaby.com/2014/01/the-problem-with-parenting-from-your-own-pain/),特別是底部的評論。當查看用戶/海報名稱時,一些名稱是超鏈接(例如,candaceerin),而另一些則不是(例如,Rachel)。該網站將用戶/海報名稱顯示爲超鏈接或文字。 – Michael

回答

0

使用union operator|將它們組合成一個XPath語句:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/a/text() | 
div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/text()[2] 

以下XPath表達式也可能工作,但它們很難看:

選項1:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]//text() 
    [(parent::div and position()=2) or parent::a[parent::div]] 

選項2:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]//text() 
    [ 
    (parent::div[contains(concat(' ', @class, ' '), ' comment-author ')]/parent::div 
    and position()=2) 
    or parent::a[div[contains(concat(' ', @class, ' '), ' comment-author ')]/parent::div] 
    ] 
+0

謝謝Mads作爲選項1爲我的案件工作。儘管它可能很醜,但它可以以可重複和一致的方式適用於我的案例。感謝幫助! – Michael

0

你真的應該編輯你的答案,以顯示HTML的相關一部分,而不是隻是鏈接到的意見一整頁。你已經熟悉結構,然而我們需要花時間和精力去到那裏,試着去看看你在說什麼。此外,您的問題對於可能存在相同問題的其他人來說並不真正有用。

不管怎麼說,這個XPath應該抓住你想要什麼:

// DIV [包含(@class, '評論的作者')] //文本()[正常化空間(),而不是(祖先:: DIV [@類= 「commentmetadata」)]

//div[contains(@class, 'comment-author')]選擇與評論的股利,那麼你試圖抓住所有用文字//text()。之後,您需要檢查文本字符串是否爲空,並且該字符串不是註釋的日期,該日期在<div class="commentmetadata"">中給出。