2016-08-31 7 views
1

XPathでページを削り取ろうとしましたが、期待通りに動作しませんでした。lxml XPath position()が機能しない

ページは

<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

いいえ、動作しないようです...下記の@tomalakのコメントでは、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)'の追加の注記は、最初のノードの文字列表現のみを提供します([documentation](https://www.w3.org/TR/xpath/#ファンクション文字列))。 XPathで文字列に変換しようとしないでください。複数のノードで作業する場合は、ホスト言語で変換してください。 – Tomalak

関連する問題