2009-05-27 12 views
75

Mam dobrze utworzoną stronę XHTML. Chcę znaleźć docelowy adres URL linku, gdy mam tekst, który jest połączony.Jak znaleźć adres URL linku za pomocą tekstu linku z XPath?

Przykład

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

że chce wyrażenie XPath taki sposób, że jeśli dany programming questions site da http://stackoverflow.com jeśli daję news da http://cnn.com.

Odpowiedz

123

powinno być coś podobnego do:

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

Czy kiedykolwiek nauczę się xpath? kiedy widzę zapytanie, jest to tak oczywiste i łatwe do zrozumienia ... ale nigdy nie jestem w stanie napisać tego na własną. – flybywire

+3

@flybywire Jeśli przeczytasz ten bezpłatny kurs Stanforda dla Wprowadzenie do baz danych, ma dobrą sekcję o XML i XPath. –

+2

Zamiast tekstu(), możesz użyć ". =", Na przykład //a[ .= "Zarejestruj się tutaj"] – danpop

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

które zasadniczo identyfikuje węzeł zakotwiczenia <a> który ma tekst, który chcesz i wydobywa atrybut href.

6

Pomyśl o wyrażeniu w nawiasach kwadratowych jako klauzula WHERE w SQL.

Tak więc to zapytanie mówi: "wybierz atrybut" href "(@) znacznika" a ", który pojawia się w dowolnym miejscu (//), ale tylko tam, gdzie (nawias zamknięty) znajduje się tekstowa treść znacznika" a " jest równy "stronie z pytaniami o programowanie".

+0

Witaj Peter, czy masz jakąś stronę z tutorialami, aby dowiedzieć się, jak wyszukiwać zapytania Xpath? –

62

zbyt późno dla ciebie, ale dla nikogo innego z tym samym pytaniem ...

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

Oczywiście, „programowania” może być dowolny fragment tekstu.

+1

Ten jest bardziej ogólny. Dobry udział –

1

jeśli używasz HTML agility użytkowania pakietu getattributeValue:

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

Przez przypadek niewrażliwe zawiera użyć następujących:

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

tłumaczyć przekształca wielkie litery w programowaniu do dolnej programowania sprawy.

+0

Proszę nie dodawać "dziękuję" jako odpowiedzi. Zainwestuj trochę czasu na stronie, a zyskasz wystarczające [przywileje] (http://stackoverflow.com/privileges), aby pobudzić odpowiedzi, które lubisz, czyli sposób przepełnienia stosu mówiąc: dziękuję. – Sklivvz

+5

"Dzięki" nie była moją "odpowiedzią". W pewnym sensie udzieliłem odpowiedzi powyżej, którą poprawiłem. – Abdo

Powiązane problemy