2011-01-24 13 views
28

Próbuję uzyskać linki ze strony z xpath. Problem polega na tym, że chcę tylko linków wewnątrz tabeli, ale jeśli zastosuję wyrażenie xpath na całej stronie, przechwycę linki, których nie chcę.Python: Używanie xpath lokalnie/na konkretnym elemencie

Na przykład:

tree = lxml.html.parse(some_response) 
links = tree.xpath("//a[contains(@href, 'http://www.example.com/filter/')]") 

Problem polega na tym, że odnosi się zwrot do całego dokumentu. I znajduje się element, którego chcę, na przykład:

tree = lxml.html.parse(some_response) 
root = tree.getroot() 
table = root[1][5] #for example 
links = table.xpath("//a[contains(@href, 'http://www.example.com/filter/')]") 

ale to wydaje się być przeprowadzenie kwerendy w całym dokumencie, jak również, jak ja nadal jestem przechwytywania linki poza stół. This page mówi, że "Kiedy xpath() jest używane w elemencie, wyrażenie XPath jest oceniane względem elementu (jeśli jest względne) lub względem drzewa głównego (jeśli jest bezwzględne):". Więc to, co używam jest wyrażeniem absolutnym i muszę go uczynić względnym? Czy to to?

Zasadniczo, w jaki sposób mogę filtrować tylko te elementy, które istnieją w tej tabeli?

Odpowiedz

47

Twój xpath zaczyna się od ukośnika (/) i dlatego jest bezwzględny. Dodać kropkę (.) z przodu, aby w stosunku do bieżącego elementu tj

links = table.xpath(".//a[contains(@href, 'http://www.example.com/filter/')]") 
+0

Jeśli jednak dodaję tę kropkę, nie wydaje się ona rekurencyjnie przeszukiwać (jak w przypadku, tylko wyszukuje w tym elemencie). Przynajmniej tak mi się wydaje, ponieważ filtr nie działa już po tym, jak zrobię go względnie. Czy istnieje sposób, aby przeszukać go z tego elementu poza wyszukiwaniem w nim? –

+0

@pvt pns To jest mocny wskaźnik, że coś innego jest nie tak. Czy możesz przesłać i połączyć się z pełnym przykładem? Jeśli nie chcesz tego zrobić, możesz również skontaktować się ze mną bezpośrednio (kliknij moje nazwisko, aby zobaczyć opcje kontaktu) – phihag

+0

@phihag: Napisałeś * Dodaj "." (kropka) z przodu, aby była względna *. Możesz również użyć 'descendant :: a [zawiera (@href, ...)] jako wyrażenie względne. –

0

Innym rozwiązaniem byłoby zapytać bezpośrednio do elementów wewnątrz tabeli. Na przykład:

tree = lxml.html.parse(some_response) 
links = tree.xpath("//table[**criteria**]//a[contains(@href, 'http://www.example.com/filter/')]") 

Gdzie **criteria** jest konieczne, jeśli istnieje wiele tabel na stronie. Niektóre możliwe kryteria to filtrowanie na podstawie identyfikatora lub klasy tabeli. Na przykład:

links = tree.xpath("//table[@id='my_table_id']//a[contains(@href, 'http://www.example.com/filter/')]") 
Powiązane problemy