¿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.

Respuestas:


141

Debería ser algo similar a:

// a [text () = 'text_i_want_to_find'] / @ href

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.


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.


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 '".


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.


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","")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.