2012-05-09 3 views
1

아마도 내가하는 일보다 더 나은 방법이있을 것입니다. 저는 은유적인 움푹 들어간 구멍에 갇혀 있습니다.XPath에서 중첩 노드를 무시하도록하려면 어떻게해야합니까?

노드의 일부를 특정 노드 아래에 가져 오려고합니다. 나는이 XPath 식으로 등장 : 나열된 content_tags의 상관 내가 원하는 을 거라고 계층 구조의 맨이 될 수

>>> content_tags = 'h1 h2 h3 h4 h5 h6 p ol ul dl table'.split() 
>>> content_xpath = './/*[%s]' % ' or '.join('self::%s' % i for i in content_tags) 
>>> content_xpath 
'.//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or 
self::h6 or self::p or self::ol or self::ul or self::dl or 
self::table]' 

, 나는 같은 이상이어야 수있는 다른 요소를 무시하려는 레벨. 안타깝게도 이 <ul> 또는 <table>, <table><ol> 등인 경우가 있고, 내부 요소가 외부와 함께 별도의 결과로 표시되는 경우가 있습니다. 좋은 방법이 있습니까 하나를 중첩 된 수있는 노드를 무시하기 위해 "컷"수행 찾았나요? 아니면 이것을 수행하는 좋은 방법이 있습니까? 어떻게 든 누락 된 것입니까?

다음은 구문 분석하려는 예제입니다.

<div class="interesting"> 
<img src="ignore-this.jpg"/> 
<h1>I want this.</h1> 
<p>I want this, too.</p> 
<div class="sidebar"> 
<ul> 
<li><p>I only want one copy of this, inside the UL.</p></li> 
<li><p>Ditto.</p></li> 
</ul> 
</div> 
</div> 

고마워요!

BTW, 나는 내가 원하는 정확히 을 할 것이라고 생각 "그나마-include- 어떤-자손 또는-자체"필터를 주장한 w3.org 메일 링리스트에 대한 몇 가지 게시물을 찾았지만 최종 사양에 포함되지 않은 것으로 보입니다. 당신은 단지 흥미로운 div 바로 아래의 p을 원하는 경우 : 그건 당신이 원하지 않을 거라면, 그렇게하지 않는

하지만 div -! :(//p와 마찬가지로 검색

답변

0

명시 적으로 재귀 계층 구조 어디서나 할 수 있습니다, 이것은 같은 표현하면 다음과 같다 :

//div[@class='interesting']/p 

을 ... 당신은 단지 검색을 기준으로하여 트리에서 위치 바로 아래의 p을 원하는 경우, 그조차 간단 :

./p 
+0

나는이 일을 정말로하고 싶지 않았지만, 그것에 대해 이야기를 나누었습니다. 이제 깊이 중첩 되더라도 원하지 않는 요소 (예 : 모두 ''요소)를 제거하는 방법을 알아야합니다. – samwyse

+0

@samwyse XQuery (XQuery Update Facility) 확장을 사용하는 XQuery 구현이 올바른 도구 일 수 있습니다. –

관련 문제