2016-08-31 45 views
1

我試圖通過XPath抓取頁面,但無法按預期工作。lxml XPath位置()不起作用

的頁面是一樣,

<tag1> 
    <tag2> 
      .... 
       <div id=article> 
        <p> stuff1 </p> 
        <p> stuff2 </p> 
        <p> ...... </p> 
        <p> stuff30 </p> 

我想通過stuff30作爲字符串提取stuff1。這是我的Python代碼片段。

import lxml.html 
import urllib.request 

html = urllib.request.urlopen('http://www.something.com/news/blah/').read() 
root = lxml.html.fromstring(html) 

content = root.xpath('string(//div[@id="article"]/p[position()=>1 and position()<=last()]/.)') 

此代碼沒有返回任何內容。

如果我從position()聲明重寫到個別元素索引,它的工作原理。

content = root.xpath('string(//div[@id="article"]/p[25]/.)') 

該代碼正確返回stuff25

我不想爲此運行循環。我相信有一種方法可以使我的代碼與position()一起工作,但不知道我的代碼中有什麼問題。

+1

在'position()=> 1'附近是否正確?不應該是'position()> = 1'嗎? – Wickramaranga

+0

不,看起來不起作用...下面的@ @ @馬來語評論,XPath中的字符串不能用於多個節點。 –

+0

@ K.K。它應該是'> ='。 '=>'會導致錯誤。 – Tomalak

回答

2

那是因爲你有位置()=> 1,應位置()> = 1

content = root.xpath('string(//div[@id="article"]/p[position()>=1 and position()<=last()]/.)') 

將設置內容stuff1。

+1

OP的附加說明:'string(// multiple/nodes)'會給你第一個節點的字符串表示(比較[文檔](https://www.w3.org/TR/xpath/#函數字符串))。不要嘗試在XPath中轉換爲字符串,如果要使用多個節點,請使用主機語言進行轉換。 – Tomalak