2016-08-31 3 views
1

XPath를 통해 페이지를 긁어 내려했지만 예상대로 작동하지 못했습니다.lxml XPath 위치()가 작동하지 않습니다.

페이지 같은이며,

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

나는 문자열로 stuff30을 통해 stuff1을 추출 할. 다음은 파이썬 코드입니다.

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