2016-09-14 4 views
0

매우 다양한 HTML 구조를 사용하여 사이트를 긁어 내려고했습니다. 해당 정보는 캡슐화되지 않았습니다. 유일한 표식은 대상 ID가 TARGETID 인 범위입니다.Xpath : 노드 옆에있는 노드 찾기

구조는 다음과 같습니다

<h2> 
    <span class="TARGETID">TARGETID</span> 
</h2> 
<p> <!-- this is not always present, could be more p tags --> </p> 
<ul> <!-- also not always present, if there, this is what we want --> </ul> 
<h2> 
    <span class="SOMEIRRELEVANTID">IRRELEVANT</span> 
</h2> 

내 접근했다 :

정렬되지 않은 목록은 TARGETID 후있을 때 성공하지만 그렇지 않은 경우가 발견 한 다음 정렬되지 않은 목록 (소요
//h2/span[contains(text(), 'TARGETID')]/../following-sibling::ul[1][count(li) > 1][li]//a/text() 

이는 쿼리를 기반으로합니다).

내 질문은 : 대상 ID가있는 범위를 포함하고 다른 ID의 범위를 사용하여 다음 H2에 의해 제한되는 것으로 시작하는 두 H2의 노드로 쿼리를 제한하려면 어떻게해야합니까?

힌트를 주시면 감사하겠습니다.

+0

예. 예제 6의 다음 'h2'가 쿼리의 리미터 역할을합니다. h2가 존재하지 않으면'ul'을 더 이상 추출하지 못하게해야합니다. – leandermelms

답변

0

이 XPath를,

//ul[preceding::h2[1][.='TARGETID']]//a 

"TARGETID"의 문자열 값을 가진 h2 후하지만 다른 h2 요소 전에 발생하는 ul 아래의 모든 a 요소를 선택합니다. 요청에 따라

그래서,이 확장 된 예를 들어,

<div> 
    <h2> 
    <span class="TARGETID">TARGETID</span> 
    </h2> 
    <p> <!-- this is not always present, could be more p tags --> </p> 
    <ul> <a href="example.com">link1</a> </ul> 
    <h2> 
    <span class="SOMEIRRELEVANTID">IRRELEVANT</span> 
    </h2> 
    <ul> <a href="example.com">link2</a> </ul> 
    <h2> 
    <span class="SOMEIRRELEVANTID">IRRELEVANT</span> 
    </h2> 
</div> 

그것은 단지

<a href="example.com">link1</a> 

하지<a href="example.com">link2</a> 선택합니다.

+0

감사합니다. 나는 당신의 솔루션을 철저히 편집했습니다 : '// ul [preceding :: h2 [1]/span [@ id = 'TARGETID']] // a' 이것은 제가 찾고 있던 것입니다. – leandermelms