Wie kann ich die Link-URL anhand des Link-Textes mit XPath finden?


87

Ich habe eine gut geformte XHTML- Seite. Ich möchte die Ziel-URL eines Links finden, wenn ich den verknüpften Text habe.

Beispiel

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

Ich möchte einen XPath- Ausdruck, der, wenn er gegeben programming questions sitewird, gibt http://stackoverflow.comund wenn ich ihn gebe, newsgibt er http://cnn.com.

Antworten:


141

Sollte etwas ähnliches sein wie:

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

73
werde ich jemals xpath lernen? Wenn ich eine Abfrage sehe, ist sie so offensichtlich und leicht zu verstehen ... aber ich kann sie nie alleine schreiben
Flybywire

4
@flybywire Wenn Sie diesen kostenlosen Stanford-Kurs zur Einführung in Datenbanken lesen, finden Sie einen guten Abschnitt zu XML und XPath.
James P.

4
Anstelle von text () können Sie ". =" Verwenden, zum Beispiel //a[.='Register here ']
danpop

1
Was ist, wenn ich den Text nicht kenne? Kann ich die Knoten auswählen, die ein httpbestimmtes Schlüsselwort enthalten?
Alston

75

Zu spät für dich, aber für alle anderen mit der gleichen Frage ...

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

Natürlich kann "Programmieren" ein beliebiges Textfragment sein.


1
Dieser ist allgemeiner. Guter Anteil
Aaron Gillion

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

Dies identifiziert im Grunde einen Ankerknoten <a>, der den gewünschten Text enthält, und extrahiert das hrefAttribut.


6

Stellen Sie sich den Ausdruck in eckigen Klammern als WHERE-Klausel in SQL vor.

In dieser Abfrage heißt es also: "Wählen Sie das" href "-Attribut (@) eines" a "-Tags aus, das an einer beliebigen Stelle (//) angezeigt wird, aber nur dort, wo (die in Klammern gesetzte Phrase) der Textinhalt des" a "-Tags gleich ist. Programmierfragen Seite '".


Hallo Peter, hast du eine Tutorial-Seite, auf der du xpath query lernen kannst?
Karim Narsindani

4

Verwenden Sie Folgendes, wenn die Groß- und Kleinschreibung nicht berücksichtigt wird:

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

translate konvertiert Großbuchstaben in PROGRAMMIERUNG in Kleinbuchstabenprogrammierung.


Bitte fügen Sie nicht "Danke" als Antwort hinzu. Wenn Sie etwas Zeit in die Website investieren, erhalten Sie ausreichende Berechtigungen , um die von Ihnen gewünschten Antworten zu verbessern. Dies ist die Art und Weise, wie Sie sich bei Stack Overflow bedanken.
Sklivvz

5
"Danke" war nicht meine "Antwort". In gewisser Weise würdigte ich eine Antwort, die ich oben verbessert hatte.
Abdo

1

Wenn Sie das HTML Agility Pack verwenden, verwenden Sie getattributeValue:

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.