저는 XPath를 처음 접하고 몇 시간 동안 만지작거렸기 때문에 다음과 같은 작업을 수행할 수 있는지 완전히 확신할 수 없습니다.
**시나리오는 다음과 같습니다. 페이지에서 링크를 찾고 싶습니다. 이 링크는 텍스트 값, 즉 태그 사이의 텍스트(이 링크)로만 인식할 수 있습니다. 지금까지 해당 텍스트와 요소를 연결하는 데 성공했지만 유일한 문제는 주변에 몇 가지가 있다는 것입니다.
이러한 링크는 다른 링크 태그가 앞에 오는 정렬되지 않은 목록에서 발견되며, 이는 내가 찾고자 하는 최종 요소에 대한 검색을 시작하기에 정말 좋은 앵커 포인트 역할을 할 수 있습니다(즉, 일치하는 첫 번째 요소를 수락할 수 있습니다) .
**조금 더 명확하게 설명하기 위해 다음과 같은 예시를 들어보겠습니다.
<a href="#">first dropdown menu</a>
<ul>
<li><a href="#">some link</a></li>
<li><a href="#">link i want to find</a></li>
</ul>
<-- *And i would actually want to find the thing from this list* -->
<a href="#">second dropdown menu</a>
<ul>
<li><a href="#">some link</a></li>
<li><a href="#">link i want to find</a></li>
</ul>
그리고 하나의 결과만 받거나 첫 번째 요소가 <정답> 요소인 결과 집합(찾고자 하는 요소)만 받도록 지정해야 합니다.
편집: 이미 질문에 대한 답변이 있었지만 사람들이 실제로 질문을 이해할 수 있도록 조금 더 구체적으로 지정해야한다는 의견이있었습니다.)
그래서 생각한 것이 문서 곳곳에 중복된 검색 결과가 있을 수 있는 다른 요소의 위치를 지정하는 데 요소를 사용하는 것이었습니다.
기본적으로 이름이나 값이 같은 요소가 있는 드롭다운 메뉴 그룹에서 특정 링크를 찾으려는 경우 이와 같은 문제가 발생할 수 있습니다.
기본적으로 그게 다입니다. 여전히 요점을 이해하기가 조금 어렵다는 것을 알고 있지만 안타깝게도 더 잘 설명하는 데 어려움을 겪고 있습니다. 다른 누군가가 더 잘 설명할 수 있을 것이라 확신하며, 그렇게 된다면 기꺼이 여기에 그 설명을 포함하겠습니다.
질문을 두어 번 읽어야했지만 이해 한 것 같습니다. 질문자께서 관심 있는 것은 술어입니다. 술어를 사용하면 조건에 따라 노드를 선택할 수 있습니다.
예를 들어 다음과 같이 할 수 있습니다:
//a[text()='second dropdown menu']/following::ul[1]/li/a[text()='link i want to find']
이렇게 하면 특정 텍스트가 포함된 앵커를 선택하고 다음 ul을 찾은 다음 해당 앵커의 자식을 통해 진행합니다.
또한 결과 집합 내에서 위치 인덱스를 지정할 수 있으며, 다음 XPath는 데모입니다(하지만 문제를 해결하지는 못합니다):
//a[text()='first dropdown menu']/ul/li[last()]/a/text()
또는 축을 사용하여 형제/조상/자식 간에 탐색할 수 있습니다:
//a[ancestor::ul/preceding::a[1]/text() = 'second dropdown menu']/text()
질문을 제대로 이해했는지 모르겠지만 XPath를 작성하는 데 도움이 될 것입니다.
기본적으로 XPath가 여러 목록의 앵커와 일치한다고 가정하고 올바른 앵커를 선택하려고 합니다. XPath의 어느 지점에서 원하는 노드가 있는 목록에 대해서만 참이 되는 조건을 지정하는 술어가 필요합니다.
제가 올바르게 이해했는지 확인하기 위해 '두 번째 드롭다운 메뉴' 뒤에 있는 '일부 링크' 노드를 원하시는군요;
ul[preceding::a[text()='second dropdown menu' and position()=last()]]/li/a[text()='link i want to find']
이것은 트릭을 수행 할 것입니다 (위치 ()=1을 확인해야하는지 100 % 확신하지는 못하지만 생략하면 선행이 <모든> 선행 노드이므로 다음 모든 ul과 일치 할 것이라고 생각합니다 - 나머지 XML 구조에 따라 다름).