2009-11-07 1 views
1

안녕하세요 최근에 Python을 사용하기 시작했으며 xPath 비트와 함께 사용하기를 원합니다. 쿼리의 결과를 인쇄 할 때만 []을 왜 그런지 모르겠다 =Python XPath 결과 표시 전용 []

import libxml2, urllib 


doc = libxml2.parseDoc(urllib.urlopen("http://www.domain.com/").read()) 
result = doc.xpathEval("//th//td[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]//a") 

if result != []: 
    print result 
elif result == "": 
    print "null" 
else: 
    print result 

doc.freeDoc() 

나는 []와는 아무런 오류가 없다. 뭐가 될수 있었는지? 나는 그것이 reaaaally 혼란을 찾을 수 있기 때문에 또한 하나 here보다 libxml2를위한 더 나은 문서 그래서 지금은 [] 내가 할 이상을 얻을 = S


편집

내가 코드를 변경

있다 구문 분석하려고하는 html의 유효성과 관련이없는 다음 결과가 표시됩니다 (하지만 내 것이 아니므로 수정할 수는 없습니다). 그 사실을 더 용서하는 파이썬에게 말하는 방법에 대한 아이디어가 있습니까?

^ Entity: line 3552: parser error : Premature end of data in tag tr line 209

^ Entity: line 3552: parser error : Premature end of data in tag tbody line 208

^ Entity: line 3552: parser error : Premature end of data in tag table line 207

^ Entity: line 3552: parser error : Premature end of data in tag input line 206

^ Entity: line 3552: parser error : Premature end of data in tag input line 205

^ Entity: line 3552: parser error : Premature end of data in tag form line 204

^ Entity: line 3552: parser error : Premature end of data in tag table line 99

^ Entity: line 3552: parser error : Premature end of data in tag div line 98

^ Entity: line 3552: parser error : Premature end of data in tag body line 96

^ Entity: line 3552: parser error : Premature end of data in tag html line 3

^ Traceback (most recent call last): File "C:\Python26\lib\site-packages\libxml2.py", line 1263, in parseDoc if ret is None:raise parserError('xmlParseDoc() failed') libxml2.parserError: xmlParseDoc() failed

사실 더 긴 목록이지만 모든 오류는 유효하지 않은 html로 인한 것이므로 여기에 모두 넣어야합니다.

+0

어떤 요소 것은 선택하려고? 어쩌면 우리가 무엇을하려고하는지 알면 문제를 파악하는 데 도움이 될 것입니다. –

+0

당신은 어떤 th 안에있는 어떤 내부의 링크를 선택하려고 시도하고 있습니다. 그 일에 대해 확신합니까? – Boldewyn

+0

... 그리고 libxml2 문서는 정말 끔찍합니다 :-) ( – Boldewyn

답변

1

XPath가 요소를 선택하지 않았을 수 있습니다. 예를 들어, 내부에있는 TD를 찾고 있지만 그 요소는 피어이므로 중첩하면 안됩니다.

count(preceding-sibling::*) = 1 대신 (count(preceding-sibling::*) + 1) = 2이 표시됩니까?

간단한 XPath를 사용하는 경우 예상되는 결과를 얻습니까?

+0

일해라. 왜 'position() = 2'? – outis

+0

나는 약간 혼란 스러울 지 모른다. 그러나 이것이 테이블 안의 모든 링크를 나에게 돌려주는 유일한 표현이다. 그렇지 않으면 나는 단지 하나 또는 두 개를 얻으십시오 – Tsundoku

0

th와 tr을 혼란 스럽습니까? th를 tr로 변경하십시오.

+0

아니요 다시 xPath 표현식이 완벽하게 작동합니다. 인쇄 할 때 []보다 더 많은 것을 얻을 수 없습니다. 이상하게도 PHP의 경우와 똑같은 것은 괜찮습니다. ,뿐만 아니라 Java에서 – Tsundoku

+0

'// th // td'를 시작하는 XPath는'th' 요소의 자손 인'td' 요소 만 선택할 것입니다. XHTML에 테이블을 포함하는 테이블 헤더가 없으면 XPath는 아무 것도 반환하지 않습니다 . –

+0

예, 테이블 내부의 링크를 반환했습니다. 아주 광범위하게 테스트했습니다. – Tsundoku

0

사이드 노트 : XPath에서 불필요한 복잡성은 어디서 비롯된 것입니까? 이 :

 
//th//td[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]//a 

은 동일합니다 :

 
//th//td[count(preceding-sibling::*) = 1)]//a 

매우 아마로 :

 
//th/td[2]//a