Come posso trovare l'URL del collegamento tramite il testo del collegamento con XPath?


88

Ho una pagina XHTML ben formata . Voglio trovare l'URL di destinazione di un collegamento quando ho il testo che è collegato.

Esempio

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

Voglio un'espressione XPath tale che, se data programming questions site, darà http://stackoverflow.come se la do, newsdarà http://cnn.com.

Risposte:


141

Dovrebbe essere qualcosa di simile a:

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

73
imparerò mai xpath? quando vedo una query è così ovvia e facile da capire ... ma non sono mai in grado di scriverne una da solo
flybywire

4
@flybywire Se leggi questo corso gratuito di Introduzione ai database di Stanford, troverai una buona sezione su XML e XPath.
James P.

4
Invece di text (), puoi usare ". =", Ad esempio //a[.='Register here ']
danpop

1
E se non conosco il testo? Posso selezionare i nodi che contengono httpo determinate parole chiave?
Alston

77

Troppo tardi per te, ma per chiunque abbia la stessa domanda ...

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

Ovviamente, la "programmazione" può essere qualsiasi frammento di testo.


1
Questo è più generalizzato. Buona condivisione
Aaron Gillion

Questo fa distinzione tra maiuscole e minuscole. Posso ignorare il caso qui?
user3060430

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

che sostanzialmente identifica un nodo di ancoraggio <a>che ha il testo desiderato ed estrae l' hrefattributo.


6

Pensa alla frase tra parentesi quadre come una clausola WHERE in SQL.

Quindi questa query dice "seleziona l'attributo" href "(@) di un tag" a "che appare ovunque (//), ma solo dove (la frase tra parentesi) il contenuto testuale del tag" a "è uguale a" sito di domande sulla programmazione "".


Ciao Peter, hai qualche sito di tutorial per imparare la query xpath?
Karim Narsindani

4

Per contiene case insensitive, utilizzare quanto segue:

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

translate converte le lettere maiuscole in PROGRAMMAZIONE in minuscole.


Si prega di non aggiungere "grazie" come risposte. Investi del tempo nel sito e otterrai privilegi sufficienti per votare le risposte che ti piacciono, che è il modo in cui Stack Overflow ti ringrazia.
Sklivvz

5
"Grazie" non era la mia "risposta". In un certo senso, stavo dando credito a una risposta che ho migliorato.
Abdo

1

se stai usando un agility pack html usa getattributeValue:

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.