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.

Flybywire
quelle

Antworten:

141

Sollte etwas ähnliches sein wie:

// a [text () = 'text_i_want_to_find'] / @ href
Badaro
quelle
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.

MaDeuce
quelle
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.

Brian Agnew
quelle
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 '".

Baxter Tidwell
quelle
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.

Abdo
quelle
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","")
Miguel Vaz
quelle