2009-05-27 22 views
75

İyi oluşturulmuş bir XHTML sayfam var. Bağlantılı bir metin olduğunda bir bağlantının hedef URL'sini bulmak istiyorum. Bir XPath ifadesini istiyorumBağlantı URL'sini bağlantı metni ile nasıl XPath ile bulabilirim?

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

Örnek programming questions site verilirse o http://stackoverflow.com verecek ve bunu news vermek eğer http://cnn.com verecektir şekilde.

cevap

123

benzer bir şey olmalı:

 
//a[text()='text_i_want_to_find']/@href 
temelde istediğiniz metni olan bir çapa düğümünü <a> tanımlar ve href niteliğini ayıklar
+60

Hiç xpath öğreneceğim mi? Bir sorguyu gördüğümde bu kadar açık ve anlaşılması kolay ... ama kendi başıma bir tane bile yazamadım – flybywire

+3

@flybywire Eğer bu Stanford'un ücretsiz Veritabanlarına Giriş dersini okursanız XML ve XPath üzerinde iyi bir bölüm var. Bunun yerine metinde(), kullanabilirsiniz ait –

+2

"=", – danpop

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

. SQL WHERE deyimi olarak köşeli parantez içinde ifade

6

düşünün.

Bu sorguda "herhangi bir yerde (//) görünen bir" a "etiketinin" href "özniteliğini (@) seçin, ancak" a "etiketinin metin içeriği yalnızca (parantez içinde ifade edilen) metin içeriği 'programlama soruları sitesi' ile eşittir ".

+0

Merhaba Peter] 'Burada //a[.='Register örneğin size xpath sorgusu öğrenmek için herhangi bir öğretici sitesi var mı? –

62

Çok sizin için geç ama aynı soruyla başkası için ... Tabii

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

, 'programlama' herhangi bir metin parçası olabilir.

+1

Bu daha genelleştirilmiştir. İyi paylaşım –

1

html çeviklik paketi kullanımı getattributeValue kullanıyorsanız:

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

tercüme küçük harf programlamaya PROGRAMLAMADA harf dönüştürür:

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

vaka duyarsız içeriyor için aşağıdaki kullanın.

+0

Lütfen cevap olarak "teşekkür" eklemeyin. Siteye biraz zaman ayırın ve istediğiniz cevapları yükseltmek için yeterli [ayrıcalıklar] (http://stackoverflow.com/privileges) kazanırsınız. – Sklivvz

+5

"Teşekkürler" benim "cevabım" değildi. Bir anlamda, üzerinde geliştirdiğim bir cevaba kredi verdim. – Abdo

İlgili konular