¿Cómo puedo encontrar la URL del enlace mediante el texto del enlace con XPath?

88

Tengo una página XHTML bien formada . Quiero encontrar la URL de destino de un vínculo cuando tenga el texto que está vinculado.

Ejemplo

<a href="http://stackoverflow.com">programming questions site</a>
<a href="http://cnn.com">news</a>

Quiero una expresión XPath tal que si se la da programming questions site, dará http://stackoverflow.comy si la doy news, dará http://cnn.com.

flybywire
fuente

Respuestas:

141

Debería ser algo similar a:

// a [text () = 'text_i_want_to_find'] / @ href
Badaro
fuente
73
¿Aprenderé alguna vez xpath? cuando veo una consulta es tan obvia y fácil de entender ... pero nunca puedo escribir una por mi cuenta
flybywire
4
@flybywire Si lee este curso gratuito de Introducción a las bases de datos de Stanford, tiene una buena sección sobre XML y XPath.
James P.
4
En lugar de text (), puede usar ". =", Por ejemplo //a[.='Registrarse aquí ']
danpop
1
¿Qué pasa si no conozco el texto? ¿Puedo seleccionar los nodos que contiene httpo determinada palabra clave?
Alston
77

Demasiado tarde para ti, pero para cualquiera que tenga la misma pregunta ...

//a[contains(text(), 'programming')]/@href

Por supuesto, "programación" puede ser cualquier fragmento de texto.

MaDeuce
fuente
1
Éste es más generalizado. Good share
Aaron Gillion
Esto distingue entre mayúsculas y minúsculas. ¿Puedo ignorar el caso aquí?
user3060430
9
//a[text()='programming quesions site']/@href 

que básicamente identifica un nodo de anclaje <a>que tiene el texto que desea y extrae el hrefatributo.

Brian Agnew
fuente
6

Piense en la frase entre corchetes como una cláusula WHERE en SQL.

Entonces, esta consulta dice, "seleccione el atributo" href "(@) de una etiqueta" a "que aparece en cualquier lugar (//), pero solo donde (la frase entre corchetes) el contenido textual de la etiqueta" a "es igual a ' sitio de preguntas de programación '".

Baxter Tidwell
fuente
Hola Peter, ¿tienes algún sitio de tutoriales para aprender la consulta xpath?
Karim Narsindani
4

Para contenidos que no distinguen entre mayúsculas y minúsculas, utilice lo siguiente:

//a[contains(translate(text(),'PROGRAMMING','programming'), 'programming')]/@href

translate convierte las letras mayúsculas en PROGRAMACIÓN a programación en minúsculas.

Abdo
fuente
No agregue "gracias" como respuestas. Invierta algo de tiempo en el sitio y obtendrá suficientes privilegios para votar las respuestas que le gusten, que es la forma de Stack Overflow de agradecer.
Sklivvz
5
"Gracias" no fue mi "respuesta". En cierto modo, estaba dando crédito a una respuesta anterior que mejoré.
Abdo
1

si está utilizando el paquete de agilidad html, use getattributeValue:

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
Miguel Vaz
fuente