Złamanie selektorów XPath

Złamanie selektorów XPath
HTML jest językiem stron internetowych, a między otwieraniem i zamknięciem każdej strony wisi wiele informacji html etykietka. Istnieje wiele sposobów na dostęp do tego, jednak w tym artykule zrobilibyśmy to za pomocą selektora XPath za pośrednictwem biblioteki złomowej Pythona.

Biblioteka Scrapy to bardzo potężna biblioteka skrobania internetowego, również łatwa w użyciu. Jeśli jesteś w tym nowy, możesz śledzić dostępny samouczek na temat korzystania z biblioteki złomowej.

Ten samouczek obejmuje użycie selektorów XPath. XPath używa ścieżki takiej jak składnia do nawigacji w węzłach dokumentów XML. Są również przydatne w nawigacji tagów HTML.

W przeciwieństwie do samouczka z powodu złomu, będziemy wykonywać wszystkie nasze operacje tutaj na terminalu. Nie oznacza to jednak, że XPath nie może być stosowany z prawidłowym programem skąpy, można je wykorzystać w bibliotece parse na parametrze odpowiedzi.

Będziemy pracować z przykładem.WebScraping.Witryna com, ponieważ jest to bardzo proste i pomogłaby zrozumieć pojęcia.

Aby użyć złomu w naszym terminalu, wpisz polecenie poniżej:

$ scrapy shell http: // Przykład.WebScraping.com

Odwiedziłby witrynę i otrzymał potrzebne informacje, a następnie pozostawiła nas interaktywną powłoką do pracy. Powinieneś zobaczyć monit na przykład:

W 1]:

Z interaktywnej sesji będziemy współpracować z odpowiedź obiekt.

Oto, jak wyglądałaby nasza składnia dla większości tego artykułu:

W [1]: odpowiedź.xpath („xpathsyntax”).wyciąg()

To polecenie powyżej służy do wyodrębnienia wszystkich dopasowanych tagów zgodnie z składnią XPath, a następnie przechowuje ją na liście.

W [2]: odpowiedź.xpath („xpathsyntax”).extract_first ()

To powyższe polecenie służy do wyodrębnienia tylko pierwszego dopasowanego znacznika i przechowuje go na liście.
Możemy teraz zacząć pracować nad składnią XPath.

Nawigacja tagów

Prowadzenie tagów w XPath jest bardzo łatwe, wszystko, czego potrzebuje, to „/” do przodu.

W [3]: odpowiedź.xpath ('/html').wyciąg()

Polecenie powyżej zwróci html tag i wszystko, co zawiera jako pojedynczy element na liście.

Jeśli chcemy uzyskać treść strony internetowej, użylibyśmy następujących czynności:

W [4]: ​​odpowiedź.xpath ('/html/body').wyciąg()

XPath pozwala również postać wieloznaczną „*”, która pasuje do wszystkiego na poziomie, na którym jest używany.

W [5]: odpowiedź.xpath ('/*').wyciąg()

Powyższy kod pasowałby do wszystkiego w dokumencie. To samo dzieje się, gdy używamy „/html”.

W [6]: odpowiedź.xpath ('/html/*').wyciąg()

Poruszając się po znacznikach, możemy uzyskać wszystkie potomkowe znaczniki określonego znacznika za pomocą „//”.

W [7]: odpowiedź.xpath ('/html // a').wyciąg()

Powyższy kod zwróciłby wszystkie znaczniki kotwicy pod tagiem HTML i.mi. Zwróciłby listę wszystkich potomków.

Tagi według atrybutów i ich wartości

Czasami poruszanie się w tagach HTML, aby dostać się do wymaganego znacznika może być problemem. Kłopot ten można odwrócić, po prostu znalezienie potrzebnego znacznika według jego atrybutu.

W [8]: odpowiedź.xpath ('/html // div [@id = "pagination"]').wyciąg()

Kod powyżej zwraca wszystkie div tagi pod html tag, który ma ID atrybut o wartości paginacja.

W [9]: odpowiedź.xpath ('/html // div [@class = "span12"]').wyciąg()

Kod powyżej zwróci listę wszystkich div znaczniki pod znacznikiem HTML, tylko wtedy, gdy mają atrybut klasy o wartości span12.

Co jeśli nie znasz wartości atrybutu? Wszystko, czego chcesz, to zdobyć tagi z konkretnym atrybutem, bez obawy o jego wartość. Robienie tego jest również proste, wszystko, co musisz zrobić, to użyć tylko symbolu @.

W [10]: odpowiedź.xpath ('/html // div [@class]').wyciąg()

Ten kod zwróciłby listę wszystkich tagów DIV, które zawierają atrybut klas.

A może jeśli znasz tylko kilka znaków zawartych w wartości atrybutu? Możliwe jest również zdobycie tego rodzaju tagów.

W [11]: odpowiedź.xpath ('/html // div [zawiera (@id, „ion”)]').wyciąg()

Kod powyżej zwróciłby wszystkie tagi div pod znacznikiem HTML, które mają atrybut identyfikatora, jednak nie wiemy, jaka wartość posiada atrybut, z wyjątkiem tego, że wiemy, że zawiera „jon”.

Strona, którą analizujemy, ma tylko jeden znacznik w tej kategorii, a wartość to „paginacja”, więc została zwrócona.

Fajnie, prawo?

Tagi po ich tekście

Pamiętaj, że wcześniej dopasowaliśmy tagi według ich atrybutów. Możemy również dopasować tagi po ich tekście.

W [12]: odpowiedź.xpath ('/html // a [.= „Algieria”] ').wyciąg()

Powyższy kod pomógłby nam uzyskać wszystkie tagi kotwiczne, które mają w sobie tekst „Algieria”. NB: To muszą być tagi z dokładnie tą treścią tekstową.

Wspaniały.

A może jeśli nie znamy dokładnej treści tekstowej i znamy tylko kilka treści tekstowych? Możemy to zrobić również.

W [13]: odpowiedź.xpath ('/html // a [zawiera (text (), „a”)]').wyciąg()

Powyższy kod otrzymałby tagi, które mają literę „a” w treści tekstowej.

Wyodrębnienie zawartości znacznika

Przez cały czas rozmawialiśmy o znalezieniu odpowiednich tagów. Czas wyodrębnić zawartość znacznika, gdy ją znajdziemy.

To dość proste. Wszystko, co musimy zrobić, to dodać „/text ()” do składni, a zawartość znacznika zostanie wyodrębniona.

W [14]: odpowiedź.xpath ('/html // a/text ()').wyciąg()

Powyższy kod otrzymałby wszystkie znaczniki kotwicy w dokumencie HTML, a następnie wyodrębnia treść tekstu.

Wyodrębnienie linków

Teraz, gdy wiemy, jak wyodrębnić tekst w znacznikach, powinniśmy wiedzieć, jak wyodrębnić wartości atrybutów. W większości przypadków wartości atrybutów, które mają dla nas ogromne znaczenie.

To jest prawie takie same, jak wyodrębnienie wartości tekstu, jednak zamiast używać „/text ()”.

W [15]: odpowiedź.xpath ('/html // a/@href').wyciąg()

Kod powyżej wyodrębniłby wszystkie łącza w znacznikach kotwicznych, łącza powinny być wartościami Href atrybut.

Prowadzenie tagów rodzeństwa

Jeśli zauważyłeś, że cały czas nawigowaliśmy tagi. Jest jednak jedna sytuacja, której nie zajęliśmy.

Jak wybrać konkretny tag, gdy znaczniki o tej samej nazwie są na tym samym poziomie?




Afganistan




Wyspy Alandzkie


W przypadku takiej jak ten, który mamy powyżej, jeśli mamy na to spojrzeć, możemy powiedzieć, że użyjemy extract_first () Aby uzyskać pierwszy mecz.

Co jednak jeśli chcemy dopasować drugą? Co jeśli jest więcej niż dziesięć opcji i chcemy piątej? Odpowiemy na to teraz.

Oto rozwiązanie: piszemy naszą składnię XPath, umieszczamy pozycję znacznika, który chcemy w nawiasach kwadratowych, tak jak indeksowanie, ale indeks zaczyna się od 1.

Patrząc na HTML strony internetowej, z którą mamy do czynienia, zauważysz, że jest dużo Tagi na tym samym poziomie. Aby zdobyć trzeci Tag, użylibyśmy następującego kodu:

W [16]: odpowiedź.xpath ('/html // tr [3]').wyciąg()

Zauważyłbyś również, że Tagi są w dwójce, jeśli chcemy tylko drugiego tagi z rzędy zrobilibyśmy następujące:

W [17]: odpowiedź.xpath ('/html // td [2]').wyciąg()

WNIOSEK:

XPath to bardzo potężny sposób przeanalizowania plików HTML i może pomóc zminimalizować użycie wyrażeń regularnych w analizowaniu ich, biorąc pod uwagę, że ma to zawiera Funkcja w składni.

Istnieją inne biblioteki, które umożliwiają parsowanie z XPath, takie jak selen do automatyzacji sieci. Xpath daje nam wiele opcji podczas analizowania HTML, ale to, co zostało potraktowane w tym artykule, powinno być w stanie przeprowadzić Cię poprzez wspólne operacje parsowania HTML.