2011-04-22 3 views
2

Visual Web Ripper의 놀라운 기능 덕분에 Xpath를 사용하여 웹 사이트를 한 번에 긁어 냈습니다 (합법적으로 한 번 !!).지정된 요소까지 다음 형제를 얻는 방법

내가 얻을 수 있어야하는 콘텐츠 필드 중 하나는 H3 태그 다음에 오는 P 태그 콘텐츠입니다.

//DIV[@id='content']/H3[. = 'Prices']/following-sibling::P[1] 

하지만 어떻게 내가 내가 다음 H3 업 될 때까지 모든 P 태그의 내용을 원하는 말할 수있다 : 나는 다음과 같은 코드를 사용할 수 있습니다 다음 중 하나를 원한다면 지금이 괜찮지?

+0

의 중복 가능성 [XPath는 : 다른 형제까지 다음의 모든 형제 자매를 선택] (http://stackoverflow.com/questions/2161766/xpath-select-all-following-siblings-until -another-sibling) – glmxndr

+0

좋은 질문입니다, +1. 노드 - 세트 교차점에 대한 일반적인 공식을 기반으로 한 완벽한 해결책은 내 대답을 참조하십시오. –

+0

@tigermain - 나는 똑같은 일을하려하고있다. PHP에서 vw-ripper의 xpath를 어떻게 사용합니까? –

답변

1

사용 : 여기

//div[@id='content']/h3[. = 'Prices'] 
    /following-sibling::p 
    [count 
     (. | 
     //div[@id='content'] 
       /h3[. = 'Prices']/following-sibling::h3/preceding-sibling::p 
    ) 
    = 
    count 
     (
     //div[@id='content'] 
      /h3[. = 'Prices']/following-sibling::h3/preceding-sibling::p 
     ) 
     ] 

우리가 두 nodesets $ns1$ns2의 교차점에 대한 Kayessian의 공식을 사용하여 피드백 및 입력들에 대한

$ns1[count(.|$ns2) = count($ns2)] 
+0

이 솔루션을 시도했지만 작동하지 않았습니다. 결과가 없습니다. –

-1

감사하지만 이벤트 쉽게 발견/그것을 빨리/더 깔끔하게하는 방법 (의견 환영)

//DIV[@id='content']/H3[. = 'Prices']/following-sibling::P[./preceding-sibling::H3[1][. = 'Prices']] 
+0

@tigerman : 신뢰할 수 있고 일반적인 솔루션이 아닙니다. 여기서'H3' 엘레멘트가 문자열 값에 의해 유일하게 식별되기 때문에 적용 할 수있다. 동일한 문자열 값을 가진 하나 이상의'H3' 엘리먼트가 있다면,이 솔루션은 원하는 노드를 선택하지 않을 수도 있습니다. 마찬가지로, 내가 제공 한 솔루션은 항상 예상 노드를 선택합니다. 당신이 배우고 싶다면이 솔루션의 혜택을 누릴 수 있습니다. –

+0

@tigerman : 또한 XPath (및 XML)는 대소 문자를 구별하며 질문에 포함 된 문을 거짓으로 만드는 경우 ('p'와 'P')를 섞어서 사용합니다. 질문을 수정하면 좋을 것입니다. XPath와 XML을 배우는 데 더주의를 기울일 것을 권합니다. –

+0

귀하의 우려 사항에 고맙게 생각합니다. 제 경우에는 이것이 문제가되지 않습니다. 실제로 H3 요소의 텍스트 값을 고유 한 식별자로 사용하고 있습니다. –

0

Visual Web Ripper를 사용하면 지정된 요소를 만날 때까지 모든 형제 노드를 포함하는 비표준 함수 SPAN을 사용할 수 있습니다.

시도 :

//DIV[@id='content']/H3[. = 'Prices']/following-sibling::P[SPAN('H3')] 
관련 문제