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.

Réponses:


141

Devrait être quelque chose de similaire à:

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

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.


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.


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


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.


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","")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.