2014-10-14 2 views
1

xpath를 사용하여 페이지에서 HTML5 마이크로 데이터를 추출하려고합니다. 필자는 본질적으로 "itemprop = name 속성을 가진 중첩 노드를 찾으십시오. 다른 namescope 요소 안에 깊이 중첩되지 않습니다". 다음 예제를 통해 제품의 이름 (신발)을 찾으려하지만 브랜드 이름 (Nike)을 원하지 않습니다.일치하는 조상이없는 요소를 찾기위한 Xpath 표현

<div itemscope itemtype="http://schema.org/Product> 
    <div itemscope itemtype="http://schema.org/Brand"> 
    <div itemprop="name">Nike</div> <!-- don't want this --> 
    </div> 
    <div itemprop="name">shoes</div> <!-- do want this --> 
</div> 

난 쉽게 // * [@에는 itemprop = 이름] 같은 것을 사용하여에는 itemprop = name 요소를 찾을 수 있지만이 또한 브랜드 이름을 끌어 것입니다. Btw 예제에 표시된 요소는 다른 태그 안에 중첩 될 수 있으므로 "직접적인 부모에게는 itemscope 속성이 없습니다"라고 말할 수는 없습니다. 사용할 수있는 조상과 관련있을 수도 있지만 잘 모르겠습니다. 충분히 xpath. 어떤 아이디어?

+0

이 예에서는'itemscope' 안에'shoes_is_ '가 있습니다. 그래서 명확히하기 위해, 가장 조상의 itemscope가있는 이름을 원하지만 둘 이상의 이름을 원하십니까? –

+0

아니면'itemscope' 요소 X가 주어진다면, X 내부에있는 모든 이름을 추출하지만 다른 어떤 'itemscope'에도 포함되어 있지 않다는 것을 의미합니까? –

+0

저는 python을 통해 libxml2 (http://xmlsoft.org/)를 사용하고 있습니다. 원래의 질문에 대한 답변을 얻으려면 두 시나리오 중 어느 것이 든이 컨텍스트에서 충분하지만 두 번째 시나리오가 아마도 더 가깝습니다. –

답변

0

에서 가장 하나 모든 itemprop="name" 요소를 찾을 수있는 하나의 표현은에서 시작하고 싶었다면 itemscope 조상

//*[@itemprop = 'name'][not(ancestor::*[@itemscope][2])] 

것을 하나의 특정 itemscope 노드를 찾은 다음 구체적으로 에 중첩 된 이름을 찾으십시오. 중첩 된 범위가 아닌 인 경우 하나의 XPath 1.0 표현식에서 수행 할 수있는 작업이 아닙니다. 먼저 해당 노드가 있는지 여부를 그 자손의 이름

.//*[@itemprop='name'] 

다음 그 각각에 대해, 찾아 가장 가까운 itemscope 조상

ancestor::*[@itemscope][1] 

를 추출하고 (파이썬 측에) 확인해야 할 것 당신이 시작한 것과 같은 노드. XPath는 2.0에서 당신은 노드 ID를 비교하는 바인딩 변수의 for $x in Y return Z 구조, 또는 is 운영자가없는

for $me in . return (.//*[@itemprop='name'][ancestor::*[@itemscope][1] is $me]) 

하지만 1.0 일에서이 작업을 수행 할 수있다.

+0

itemscope 조상? 그게 네 xpath를 이해 한거야. –

+0

@TobyHobson 네, 죄송합니다. 오타가 수정되었습니다. –

0

이 시도주십시오 :

//*[@itemprop = 'name' and not(ancestor::*[@itemscope][2])] 
관련 문제