2013-05-30 125 views
0

我有以下的html:的XPath前面的兄弟

<div id="content-home"> 
    <p>some date 1</p> 
    <div class="content"><p>bla1.1</p></div> 
    <div class="content"><p>bla1.2</p></div> 
    <p>some date 2</p> 
    <div class="content"><p>bla2.1</p></div> 
    <div class="content"><p>bla2.2</p></div> 
    <div class="content"><p>bla2.3</p></div> 
    <p>some date 3</p> 
    <div class="content"><p>bla3.1</p></div> 
    <div class="content"><p>bla3.2</p></div> 
    <div class="content"><p>bla3.3</p></div> 
    <div class="content"><p>bla3.4</p></div> 
</div> 

使用XPath我想回去每個DIV類內容的日期。有了這個:

tree.xpath("///div[@id='content-home']/p[following-sibling::div[@class='content']]/text()") 

tree.xpath("///div[@id='content-home']/p[preceding-sibling::div[@class='content']]/text()") 

我只得到一個有3項列表。我想回復9條目(2個日期1,3個日期3和4個日期4,我嘗試了很多東西,但保留3個條目(日期1,日期2,日期3)。我怎麼能意識到這一點。註冊的每個格內容的日期

有人可以幫助請

+3

我在數據中看不到任何@ class ='post'。 – choroba

+0

當然,這應該是@ class =「content」。剛剛編輯。但結果是一樣的。 – Geveze

+0

對於lxml不支持的那種,您需要XPath 2.0。 –

回答

4

我沒有立即看到一個XPath表達式做這個,但一些中間的Python使得它很容易的:?

>>> divs = x.xpath("//div[@class='content'][preceding-sibling::p]") 
>>> [d.xpath("string((preceding-sibling::p)[last()])") 
... for d in divs] 
['some date 1', 'some date 1', 'some date 2', 'some date 2', 'some date 2', 'some date 3', 'some date 3', 'some date 3', 'some date 3'] 

第二個XPath表達式可以從裏面讀出:

preceding-sibling::p 

表示正在考慮的div的前面的兄弟姐妹,其具有標籤p。其中,

(preceding-sibling::p)[last()] 

是最後一個。你需要括號,因爲[]::更強。

然後用string()調用(因爲text() is a code smell)將字符串值取出。

+0

它的工作原理!但我其實不明白你的第二行:( – Geveze

+0

@Geveze:貼出瞭解釋。 –

+0

thnx larsman,這真的有幫助! – Geveze