여기서 XPath contains ()를 사용하는 방법은 무엇입니까?


142

XPath를 배우려고합니다. 이 contains()주변 의 다른 예제를 보았지만 AND 연산자 를 사용하는 것은 없습니다 . 나는 이것을 작동시킬 수 없다 :

//ul[@class='featureList' and contains(li, 'Model')]

의 위에:

...
<ul class="featureList">

<li><b>Type:</b> Clip Fan</li><li><b>Feature:</b> Air Moved: 65 ft.
    Amps: 1.1
    Clip: Grips any surface up to 1.63"
    Plug: 3 prong grounded plug on heavy duty model
    Usage: Garage, Workshop, Dorm, Work-out room, Deck, Office & more.</li><li><b>Speed Setting:</b> 2 speeds</li><li><b>Color:</b> Black</li><li><b>Power Consumption:</b> 62 W</li><li><b>Height:</b> 14.5"</li><li><b>Width:</b> Grill Diameter: 9.5"</li><li><b>Length:</b> 11.5"</li>

<li><b>Model #: </b>CR1-0081-06</li>
<li><b>Item #: </b>N82E16896817007</li>
<li><b>Return Policy: </b></li>
</ul>
...

이것은 나를 위해 작동합니다, 나는 whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm에서
mihi

답변:


199

텍스트를 포함 할 수있는 자식 요소를 li찾는 대신 쿼리에서 첫 번째 li자식 만보고 있습니다 'Model'. 필요한 것은 다음과 같은 쿼리입니다.

//ul[@class='featureList' and ./li[contains(.,'Model')]]

이 쿼리는 텍스트를 포함하는 하나 이상의 자식 이있는 class의 요소를 제공합니다 .featureListli'Model'


13
+1- "./"는 약간 오해의 소지가 있습니다. 현재 노드 이외의 다른 노드를 제외하면 고려할 것이지만 실제로는 중복됩니다. "// ul [@ class = ' featureList '와 li [contains (.,'Model ')]] "도 마찬가지입니다.
Tomalak 2016 년

4
예, 나는 단지 구체적이었습니다. 지나치게 구체적 일 수 있습니다.
Jeff Yates

어떤이있는 경우 liModelul, 다음 and조건은 실패하지 않습니다. 그래서 and조건을 반환 false빈 세트에, 그것은 올바른?
damluar

58

나는 이미 +1을 Jeff Yates의 솔루션에 주었다.

접근 방식이 작동하지 않는 이유에 대한 간단한 설명입니다. 이:

// ul [@ class = 'featureList'및 포함 (li, 'Model')]

contains()함수 (또는 그 문제에 대한 XPath의 다른 문자열 함수) 의 제한이 발생합니다 .

첫 번째 인수는 문자열이어야합니다. 노드 목록에 " li" 를 주면 노드 목록을 제공하면 문자열로 변환해야합니다. 그러나이 변환은 목록의 첫 번째 노드에 대해서만 수행됩니다.

귀하의 경우 목록의 첫 번째 노드는 <li><b>Type:</b> Clip Fan</li>(문자열 : " Type: Clip Fan" 로 변환 됨 ) 이는 다음을 의미합니다.

// ul [@ class = 'featureList'및 포함 (li, 'Type')]

실제로 노드를 선택합니다!


1
좋은 질문은 ".//td[contains(.//*,'something ')]"같은 쿼리가 1의 깊이까지만 작동하는 이유를 알아 내기 위해 고군분투하고 있습니다. 위의 방법이 전혀 작동하지 않았는지 확인하십시오. 실제로 필요한 것은 ".//td[.//*[contains(.,'something ')]]" "
JonnyRaa

11

이것은 XPath에서 일반적인 오해 에 대한 오래된 질문에 대한 새로운 대답입니다 contains()...

요약 : contains()수단 문자열을 포함 , 하지 노드를 포함 .

상해

이 XPath는 종종 잘못 해석됩니다.

//ul[contains(li, 'Model')]

잘못된 해석 : 포함ul요소를 선택하십시오 .li 요소를Model .

이것은 잘못 되었기 때문에

  1. contains(x,y) 기대 x문자열이 될 하고
  2. 여러 요소를 문자열로 변환하는 XPath 규칙은 다음과 같습니다.

    노드 세트는 문서 순서 에서 첫 번째 인 노드 세트에있는 노드 의 문자열 값 을 리턴하여 문자열 로 변환됩니다 . 노드 집합이 비어 있으면 빈 문자열이 반환됩니다.

올바른 해석 : 첫 번째 자식 에 하위 문자열 이 포함 된 문자열 이있는 ul요소를 선택하십시오 . liModel

XML

<r>
  <ul id="one">
    <li>Model A</li>
    <li>Foo</li>
  </ul>
  <ul id="two">
    <li>Foo</li>
    <li>Model A</li>
  </ul>
</r> 

XPath

  • //ul[contains(li, 'Model')]one ul요소를 선택합니다 .

    참고 :two ul 요소가 선택되지 않기 때문에 처음의 문자열 값 li의 자녀 two ul입니다 Foo포함하지 않는, Model문자열을.

  • //ul[li[contains(.,'Model')]]onetwo ul요소를 선택합니다 .

    참고 : 각각에 개별적으로 적용 ul되므로 두 요소가 모두 선택 contains()됩니다 li. (따라서 까다로운 다중 요소-문자열 변환 규칙을 피할 수 있습니다.) 두 ul요소에는 모두 li문자열 값에 Model하위 문자열이 포함 된 자식이 있습니다 li. 요소의 위치는 더 이상 중요하지 않습니다.

또한보십시오


-2
//ul[@class="featureList" and li//text()[contains(., "Model")]]

-5

contains예를 여기에 붙여 넣으 십시오.

//table[contains(@class, "EC_result")]/tbody

2
OP의 코드 에는 table요소 또는 EC_result클래스 값 이 없습니다 . 이 답변은 여기서 의미가 없으므로 삭제해야합니다.
kjhughes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.