Jak znaleźć adres URL łącza za pomocą tekstu łącza za pomocą XPath?

88

Mam dobrze uformowaną stronę XHTML . Chcę znaleźć docelowy adres URL łącza, gdy mam tekst, do którego prowadzi łącze.

Przykład

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

Chcę wyrażenia XPath takiego, że jeśli zostanie podane programming questions site, da, http://stackoverflow.coma jeśli podam, newsda http://cnn.com.

Lecieć jak po sznurku
źródło

Odpowiedzi:

141

Powinien być podobny do:

// a [text () = 'text_i_want_to_find'] / @ href
Badaro
źródło
73
czy kiedykolwiek nauczę się xpath? kiedy widzę zapytanie, jest to takie oczywiste i łatwe do zrozumienia ... ale nigdy nie jestem w stanie napisać go samodzielnie
flybywire
4
@flybywire Jeśli czytasz ten bezpłatny kurs Wprowadzenie do baz danych w Stanford ma dobrą sekcję na temat XML i XPath.
James P.
4
Zamiast tekstu () możesz użyć „. =”, Na przykład //a[.='Register here ']
danpop
1
A jeśli nie znam tekstu? Czy mogę wybrać węzły, które zawierają httplub określone słowo kluczowe?
Alston,
77

Dla ciebie za późno, ale dla każdego z tym samym pytaniem ...

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

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

MaDeuce
źródło
1
Ten jest bardziej ogólny. Dobra akcja
Aaron Gillion
Rozróżniana jest wielkość liter. Czy mogę tutaj zignorować ten przypadek?
user3060430
9
//a[text()='programming quesions site']/@href 

który zasadniczo identyfikuje węzeł zakotwiczenia zawierający żądany <a>tekst i wyodrębnia hrefatrybut.

Brian Agnew
źródło
6

Wyobraź sobie frazę w nawiasach kwadratowych jako klauzulę WHERE w języku SQL.

To zapytanie mówi, „wybierz atrybut„ href ”(@) tagu„ a ”, który pojawia się gdziekolwiek (//), ale tylko wtedy, gdy (fraza w nawiasach kwadratowych) zawartość tekstowa tagu„ a ”jest równa„ strona z pytaniami programistycznymi '”.

Baxter Tidwell
źródło
Cześć Peter, czy masz jakąś witrynę z samouczkami do nauki zapytania xpath?
Karim Narsindani,
4

W przypadku zawartości bez rozróżniania wielkości liter użyj następującego:

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

translate konwertuje wielkie litery w PROGRAMOWANIU na małe litery.

Abdo
źródło
Nie dodawaj „dziękuję” jako odpowiedzi. Zainwestuj trochę czasu w tę stronę, a zyskasz wystarczające uprawnienia do głosowania za odpowiedziami, które lubisz, co jest sposobem na podziękowanie za pomocą przepełnienia stosu.
Sklivvz
5
„Dzięki” nie było moją „odpowiedzią”. W pewnym sensie przyznawałem zasługę powyższej odpowiedzi, którą poprawiłem.
Abdo,
1

jeśli używasz pakietu agility html, użyj getattributeValue:

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
Miguel Vaz
źródło