Comment puis-je trouver l'URL du lien par le texte du lien avec XPath?

88

J'ai une page XHTML bien formée . Je souhaite trouver l'URL de destination d'un lien lorsque j'ai le texte lié.

Exemple

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

Je veux une expression XPath telle que si programming questions siteelle est donnée, elle donnera http://stackoverflow.comet si je la donne, newselle donnera http://cnn.com.

flybywire
la source

Réponses:

141

Devrait être quelque chose de similaire à:

// a [text () = 'text_i_want_to_find'] / @ href
Badaro
la source
73
vais-je jamais apprendre xpath? quand je vois une requête, c'est tellement évident et facile à comprendre ... mais je ne suis jamais capable d'en écrire une seule
flybywire
4
@flybywire Si vous lisez ce cours gratuit d'introduction aux bases de données de Stanford, vous trouverez une bonne section sur XML et XPath.
James P.
4
Au lieu de text (), vous pouvez utiliser ". =", Par exemple //a[.='Register here ']
danpop
1
Et si je ne connais pas le texte? Puis-je sélectionner les nœuds qui contiennent httpou certains mots clés?
Alston le
77

Trop tard pour vous, mais pour quiconque a la même question ...

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

Bien sûr, la «programmation» peut être n'importe quel fragment de texte.

MaDeuce
la source
1
Celui-ci est plus généralisé. Bonne part
Aaron Gillion
Ceci est sensible à la casse. Puis-je ignorer le cas ici?
user3060430
9
//a[text()='programming quesions site']/@href 

qui identifie essentiellement un nœud d'ancrage contenant <a>le texte souhaité et extrait l' hrefattribut.

Brian Agnew
la source
6

Considérez la phrase entre crochets comme une clause WHERE dans SQL.

Donc, cette requête dit, "sélectionnez l'attribut" href "(@) d'une balise" a "qui apparaît n'importe où (//), mais uniquement là où (la phrase entre crochets) le contenu textuel de la balise" a "est égal à" site de questions de programmation '".

Baxter Tidwell
la source
Salut Peter, avez-vous un site de didacticiel pour apprendre la requête xpath?
Karim Narsindani
4

Pour les conteneurs insensibles à la casse, utilisez ce qui suit:

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

translate convertit les lettres majuscules dans la PROGRAMMATION en programmation minuscule.

Abdo
la source
Veuillez ne pas ajouter «merci» comme réponse. Investissez du temps sur le site et vous obtiendrez des privilèges suffisants pour voter pour les réponses que vous aimez, ce qui est la façon dont Stack Overflow vous remercie.
Sklivvz
5
"Merci" n'était pas ma "réponse". J'étais, d'une certaine manière, en accordant du crédit à une réponse ci-dessus que j'ai améliorée.
Abdo
1

si vous utilisez le pack d'agilité html, utilisez getattributeValue:

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