2009-05-27 65 views
75

Tengo una página bien formada XHTML. Quiero encontrar la URL de destino de un enlace cuando tengo el texto vinculado.¿Cómo puedo encontrar la URL del enlace por texto de enlace con XPath?

Ejemplo

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

Quiero una expresión XPath de tal manera que si se les da programming questions site dará http://stackoverflow.com y si lo doy news dará http://cnn.com.

Respuesta

123

debe ser algo similar a:

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

¿Alguna vez aprenderé xpath? cuando veo una consulta, es tan obvio y fácil de entender ... pero nunca puedo escribir una por mi cuenta – flybywire

+3

@flybywire Si lees este curso gratuito de introducción a bases de datos de Stanford tiene una buena sección sobre XML y XPath. –

+2

En lugar de texto(), puede usar ". =", Por ejemplo //a[.='Registrar aquí '] – danpop

8
//a[text()='programming quesions site']/@href 

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

6

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

Entonces esta consulta dice, "selecciona 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' ".

+0

Hola Peter, ¿tiene algún sitio de tutorial para aprender la consulta xpath? –

62

demasiado tarde para ti, sino para cualquier otra persona con la misma pregunta ...

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

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

+1

Este es más generalizado. Buena participación –

1

si está utilizando html agilidad uso paquete getattributeValue:

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

Para el caso insensible contiene, utilice la siguiente:

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

traducen convierte mayúsculas en la programación para la programación minúsculas.

+0

Por favor, no agregue "gracias" como respuestas. Invierta un poco de tiempo en el sitio y obtendrá suficientes [privilegios] (http://stackoverflow.com/privileges) para enviar respuestas que le gusten, que es la forma de Desbordamiento de pila de decir gracias. – Sklivvz

+5

"Gracias" no fue mi "respuesta". Estaba, en cierto modo, dando crédito a una respuesta anterior que mejoré. – Abdo

Cuestiones relacionadas