regulares - XPath: selecciona el primer elemento después de otro elemento
xpath expresiones regulares (3)
Corrígeme si me equivoco: debe seleccionar "segundo menú desplegable" del ejemplo anterior, pero el texto puede duplicarse, por lo que solo necesita el segundo. XPath:
//a[text()=''second drop down menu''][2]
Soy bastante nuevo en XPath, he estado jugueteando con él durante unas horas, así que no estoy del todo seguro de si puedes hacer algo como lo siguiente con él.
Bueno, aquí está el escenario: quiero encontrar un enlace de una página. Ese enlace solo es reconocible por su valor de texto, es decir. el texto entre las etiquetas <a> (<a href="#"> este enlace <a>). Hasta ahora he logrado ponerme en contacto para vincular elementos con ese texto, el único problema es que hay algunos de esos por ahí.
Estos enlaces se encuentran a partir de listas desordenadas que están precedidas por otra etiqueta de enlace, que serviría como un punto "ancla" realmente bueno para comenzar la búsqueda del elemento final que quiero encontrar (es decir, entonces podría aceptar el primero) eso combina)
Para aclarar un poco las cosas, aquí hay un ejemplo de lo que está pasando:
<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>
Y probablemente debería especificar, que solo quiero recibir un resultado o un conjunto de resultados, siendo el primer elemento el elemento "correcto", el elemento que quiero encontrar.
EDIT: la pregunta ya ha sido respondida, pero hubo algunos comentarios que debo especificar esto un poco más, para que la gente realmente pueda entender la pregunta;)
Entonces la idea era usar un elemento para especificar la ubicación de otro elemento que podría tener resultados de búsqueda duplicados diseminados por todo el documento.
Básicamente, se encontraría con algo como esto si quisiera encontrar un enlace determinado de un grupo de menús desplegables que tendrían elementos con los mismos nombres o valores.
Eso es básicamente eso. Sé que todavía es un poco difícil entender el tema, pero desafortunadamente estoy teniendo dificultades para tratar de explicarlo mejor. Estoy seguro de que alguien más podría hacer un mejor trabajo y si eso sucede, estoy más que feliz de incluir esa descripción aquí.
Tuve que leer su pregunta un par de veces, pero creo que lo entiendo. Lo que te interesa son los predicados. Los predicados le permiten elegir nodos según las condiciones.
Por ejemplo, podrías hacer:
//a[text()=''second dropdown menu'']/following::ul[1]/li/a[text()=''link i want to find'']
esto seleccionaría cualquier delimitador con cierto texto, encuentra el siguiente ul, luego procede a través de sus hijos.
Además, puede especificar el índice posicional dentro de un conjunto de resultados, el siguiente XPath es una demostración (pero no resolverá su problema):
//a[text()=''first dropdown menu'']/ul/li[last()]/a/text()
o puede usar ejes para navegar a través de hermanos / antepasados / hijos:
//a[ancestor::ul/preceding::a[1]/text() = ''second dropdown menu'']/text()
Así que no estoy seguro de haber entendido bien tu pregunta, pero esto debería ayudarte a escribir tu XPath.
Básicamente, supongo que su XPath coincide con el ancla en múltiples listas y desea asegurarse de elegir la correcta. En algún punto de su XPath necesita un predicado para especificar una condición que solo será cierta para la lista en la que se encuentra su nodo deseado.
para que lo entienda correctamente: desea el nodo "algún enlace" después del "segundo menú desplegable"
ul[preceding::a[text()=''second dropdown menu'' and position()=last()]]/li/a[text()=''link i want to find'']
esto debería ser el truco (no estoy 100% seguro de que necesitarás verificar la posición () = 1, pero creo que si la omites, coincidirá con todos los siguientes ul ya que el anterior es "todos" los nodos precedentes - eso depende del resto de tu estructura xml)