2009-05-27 6 views
75

Ich habe eine wohlgeformte XHTML Seite. Ich möchte die Ziel-URL eines Links finden, wenn ich den verknüpften Text habe.Wie kann ich die Link-URL per Link-Text mit XPath finden?

Beispiel

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

ich einen XPath Ausdruck so wollen, dass es http://stackoverflow.com geben, wenn programming questions site gegeben und wenn ich es news geben wird es http://cnn.com geben.

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

Antwort

123

Sollte etwas ähnliches sein.

+60

werde ich jemals XPath lernen? wenn ich eine Abfrage sehe, ist es so offensichtlich und leicht zu verstehen ... aber ich bin nie in der Lage, eine selbst zu schreiben – flybywire

+3

@flybywire Wenn Sie dies lesen, hat Stanford freie Einführung in Datenbanken natürlich einen guten Abschnitt über XML und XPath. –

+2

Anstelle von text() können Sie ". =" Verwenden, zum Beispiel //a[.='Registrieren Sie sich hier '] – danpop

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

die im Grunde einen Ankerknoten <a> identifiziert, die den Text hat Sie wollen, und extrahiert die href Attribut:

6

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

Also diese Abfrage sagt, "wählen Sie die" href "-Attribut (@) eines" a "-Tags, die irgendwo (//) erscheint, aber nur wo (der Klammersatz) den textlichen Inhalt des" a "-Tags ist gleich "Programmier-Fragen-Website" ".

+0

Hallo Peter, haben Sie eine Tutorial-Site, um XPath-Abfrage zu lernen? –

62

für Sie zu spät, aber für alle anderen mit der gleichen Frage ...

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

Natürlich ‚Programmierung‘ kann jedes Textfragment sein.

+1

Dieser ist allgemeiner. Guter Anteil –

1

, wenn Sie HTML-Agilität Pack Verwendung getattributeValue verwenden:

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

Für Groß- und Kleinschreibung enthält, verwenden Sie die folgenden Schritte aus:

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

übersetzen wandelt Großbuchstaben in PROGRAMMIER in Kleinbuchstaben Programmierung.

+0

Bitte nicht "Danke" als Antworten hinzufügen. Investieren Sie einige Zeit in die Site und Sie werden genügend [privilities] (http://stackoverflow.com/privileges) bekommen, um Antworten zu loben, die Ihnen gefallen. Das ist die Stack Overflow Art, Ihnen zu danken. – Sklivvz

+5

"Danke" war nicht meine "Antwort". Ich gab gewissermaßen eine Antwort, über die ich mich verbesserte. – Abdo

Verwandte Themen