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.