2012-05-02 3 views
1

나는 특히파이썬은 특정 검색

...table/tbody/tr[4]/td[2] 

에서 안정적으로 나무에 깊이 위치 추출 할 텍스트의 XPath는 깊은 중첩와 XPath를 LXML, TD [2]를

<td class="val">xyz</td> 
과 같이 구성되어있다

"xyz"라는 텍스트를 추출하려고 시도하지만 확장 검색은 여러 개의 결과를 반환합니다. 예를 들어 다음 경로는 10 개의 요소를 반환합니다.

xpath('//td[@class="val"]') 

... 특정 검색이 요소를 반환하지 않는 동안. 다음 중 아무 것도 반환하지 않는 이유가 확실하지 않습니다.

xpath('//tbody/tr/td[@class="val"]') 

하나의 솔루션이 포함 ..

table = root.xpath('//table[@class="123"]') 

#going down the tree 
xyz = table[0][3][1] 
print vol.text 

는 그러나, 나는 매우 부서지기 쉬운이 확신합니다. 누군가가 작동하는 방법을 취소 취성과 자원

+3

방금과 테스트, 일부 유효한 XML을 붙여 넣을 수 있습니다를 보는 대신'주는 대신 할 수는 없다 ... 테이블/tbody/... ' –

+1

예제 XML 문서를 제공해주십시오. 말하자면 10 줄보다 길다면 [pastebin.com] (http://pastebin.com) 또는 [gist] (https://gist.github.com/) – phihag

+1

에서 업로드하거나 트리밍 할 수 있습니다 xml 문서를 파이썬 코드에서 사용하고 문제를 보여주는 샘플 파이썬 코드를 붙여 넣습니다. 붙여 넣기를 복사하고 코드를 실행하여 문제를 봅니다. 내 대답과 비슷한 무언가 –

답변

0

당신은 명시 적으로 언급하지 않은,하지만 대상 tabletd 태그 클래스가 신뢰할 수있는 경우에 당신은 같은 것을 할 수있는 :

//table[@class="123"]/descendant::td[@class="val"] 

을 그리고 당신은 절반 tbody의 문제가 아닌지 것을 피하다.

그러나, 실제로 당신이 XPATH 쿼리를 추천하기위한 분석하고자하는 물질 ...

1

이 보인다 상대적으로 싼 둘 것하는 XPath 검색을 구성하는 말해 수 있다면 나는 그것을 감사하겠습니다

from lxml import etree 

doc = etree.HTML('<html><body><table><tbody><tr><td>bad</td><td class="val">xyz</td></tr></tbody></table></body></html>') 
print doc.xpath('//tbody/tr/td[@class="val"]')[0].text 

출력 :

xyz 

그래서 문제가 무엇입니까?

2
...table/tbody/tr[4]/td[2] 

필자는 Firebug와 같은 도구를 통해이 XPath를 발견했다고 생각합니다. Firebug (또는 브라우저 내의 다른 검사 도구)와 같은 도구에 대해주의해야 할 점은 브라우저 자체에서 생성 된 DOM 트리를 사용하고 브라우저의 대부분의 HTML 구문 분석기가 전달 된 HTML을 유효하게 만들려고 열심히 노력한다는 것입니다. 표준에 따라 다양한 태그를 추가해야하는 경우가 있습니다.

<tbody>이 태그 중 하나입니다. <tr> tags are only allowed as a child of <thead>, <tbody> or <tfoot> tags. 불행히도 내 경험상 실제 소스의 <table> 안에 이러한 태그 중 하나가 거의 표시되지 않지만 브라우저가 standard requires to do so부터 유효하게 만들기 위해 구문 분석을하는 동안 필요한 태그를 추가합니다.

이 기사를 요약하면 실제 소스에는 <tbody> 태그가 없을 수 있습니다. 이것이 바로 XPath가 아무것도 반환하지 않는 이유입니다.

XPath 쿼리를 생성하는 방법은 특정 페이지/xml에 크게 의존합니다. 일반적으로 td[4]과 같은 위치 정보 쿼리는 무언가가 추가 될 때 쉽게 깨지는 경향이 있으므로 최후의 수단이되어야합니다. 마크 업을 신중하게 검사하고 id 또는 class과 같은 속성을 사용하는 쿼리가 위치 지정 쿼리보다 더 확실하게 추가되므로 쿼리를 만들어야합니다. 그러나 결국, 그것은 문제의 페이지의 세부 사항으로 모두 귀결됩니다.

+1

당신은 당신의 요점에 약간의 강조점을 더할 수 있습니다. * 소스에 "tbody"가 없습니다. * – MattH

+0

@MattH : 좋습니다. 할 것이다. – Avaris