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.

Odpowiedzi:


141

Powinien być podobny do:

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

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.


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.


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 '”.


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.


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","")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.