2010-06-25 177 views
2

我目前正致力於從HTML提取數據。我想提取兩個<p class="xfHeading">標籤之間的文字。兩個標籤之間的XQuery提取

  <p class="xfHeading"><b>XYZ:</b></p> 
      <p>asdfghjk</p> 
      <p>sdsdsd</p> 
      <p>asdvcvcfghjk</p> 

     <p class="xfHeading"><b>ABC:</b></p> 
      <P>fvgbhnjm</P> 

     <p class="xfHeading"><b>PQR:</b></p> 
      <ul> 

      </ul> 

     <p class="xfHeading"><b>MNO:</b></p> 
      <ul> 
       <li>jdjshdj</li> 
      </ul> 

輸出應該是:

asdfghjk

sdsdsd

asdvcvcfghjk

做到這一點

一種方法是:

/p[class="xfHeading"]/following-sibling::p[0]|/p[class="xfHeading"]/following-sibling::p[1]|/p[class="xfHeading"]/following-sibling::p[2] 

/p[class="xfHeading"]/following-sibling::p[position()<4] 

然而,由於不斷改變我需要,其中,所述兩個標籤<p class="xfHeading">之間的內容被提取溶液中的所有的時間之間的內容。

+0

感謝您的澄清!我用一個新建議更新了我的答案。 – nearlymonolith 2010-06-25 15:22:53

回答

0

使用

(//p[@class="xfHeading"])[1] 
      /following-sibling::p 
      [. << (//p[@class="xfHeading"])[2]] 
       /text() 

這意味着:選擇與的xfHeading具有值class屬性繼第一p元件的兄弟姐妹文檔中的所有p元素的文本節點的孩子,並且同時在文檔中的第二p元素之前,class屬性的值爲xfHeading

+0

感謝Dimitre它像寶石一樣工作。你救了我的臉。 – Technocrat 2010-06-26 15:31:26

0

編輯:經過您的澄清,我的建議是使用FLWOR表達式,如下所示。這會根據<b>標記的唯一內容查找具有適當<b>標記內容的<p>,並返回作爲其兄弟的每個<p>標記的文本。

for $b in //p[class="xfHeading"]/b and $p in //p[class="xfHeading"]/p 
    where $b/text() = "XYZ:" 
     return p/text() 

注意,//是XPATH結構,不評論

OLD答案:如果沒有你想要什麼結果數據的樣子,回答這個問題的例子是位強硬。然而,要選擇,例如,一個<b>標籤裏面的文字,你會怎麼做:

/p[class = "xfHeading"]/b/text() 

一般來說,附加text()到表達式的結束返回有問題的節點中的文本。

相關問題