Struganje

Scrap s XPath Selectors

Scrap s XPath Selectors
HTML je jezik web stranica, a između otvaranja i zatvaranja svake web stranice ima puno informacija html označiti. Postoji mnogo načina da se tome pristupi, no u ovom bismo članku to činili pomoću Xpath selektora kroz Pythonovu biblioteku Scrapy.

Biblioteka Scrapy vrlo je moćna biblioteka za struganje weba, također jednostavna za upotrebu. Ako ste novi u ovome, možete slijediti dostupne upute o korištenju biblioteke Scrapy.

Ovaj vodič opisuje upotrebu Xpath selektora. Xpath koristi put poput sintakse za kretanje čvorovima XML dokumenata. Oni su također korisni u navigaciji HTML oznakama.

Za razliku od tutorijala za Scrapy, mi ćemo radi jednostavnosti raditi sve svoje operacije ovdje na terminalu. To ne znači da se Xpath ne može koristiti s odgovarajućim programom Scrapy, već se mogu koristiti u knjižnici raščlanjivanja parametra odgovora.

Radit ćemo na primjeru.webscraping.com, jer je vrlo jednostavno i pomoglo bi razumijevanju pojmova.

Da biste koristili scrapy u našem terminalu, upišite naredbu ispod:

$ scrap shell http: // primjer.webscraping.com

Posjetio bi web mjesto i dobio potrebne informacije, a zatim bi nam ostavio interaktivnu ljusku za rad. Trebali biste vidjeti upit poput:

U [1]:

Od interaktivne sesije radit ćemo s odgovor objekt.

Evo kako bi naša sintaksa izgledala za veći dio ovog članka:

U [1]: odgovor.xpath ('xpathsyntax').ekstrakt()

Ova gornja naredba koristi se za izdvajanje svih podudarnih oznaka prema sintaksi Xpath, a zatim ih sprema na popis.

U [2]: odgovor.xpath ('xpathsyntax').extract_first ()

Gornja naredba koristi se za izdvajanje samo prve podudarne oznake i pohranjivanje na popis.
Sada možemo početi raditi na sintaksi Xpath.

NAVIGACIJSKE OZNAKE

Navigacija oznakama u Xpathu vrlo je jednostavna, potrebna je samo kosa crta unaprijed "/" nakon koje slijedi naziv oznake.

U [3]: odgovor.xpath ('/ html').ekstrakt()

Gornja naredba vratila bi html i sve što sadrži kao jednu stavku na popisu.

Ako želimo dobiti tijelo web stranice, koristili bismo sljedeće:

U [4]: ​​odgovor.xpath ('/ html / body').ekstrakt()

Xpath također dopušta zamjenski znak "*", koji odgovara svemu na razini u kojoj se koristi.

U [5]: odgovor.xpath ('/ *').ekstrakt()

Gornji kod odgovarao bi svemu u dokumentu. Ista se stvar događa kada koristimo '/ html'.

U [6]: odgovor.xpath ('/ html / *').ekstrakt()

Pored navigacijskih oznaka, sve potomke određene oznake možemo dobiti pomoću "//".

U [7]: odgovor.xpath ('/ html // a').ekstrakt()

Gornji kôd vratio bi sve sidrene oznake ispod u html oznaci i.e. vratio bi popis svih sidrenih oznaka potomka.

OZNAKE PO ATRIBUTIMA I NJIHOVE VRIJEDNOSTI

Ponekad bi navigacija html oznakama da biste došli do potrebne oznake mogla predstavljati poteškoće. Ovu se nevolju može spriječiti jednostavnim pronalaženjem potrebne oznake prema njezinom atributu.

U [8]: odgovor.xpath ('/ html // div [@id = "paginacija"]').ekstrakt()

Gornji kod vraća sve datoteke div oznake ispod html oznaka koja ima iskaznica atribut s vrijednošću paginacija.

U [9]: odgovor.xpath ('/ html // div [@class = "span12"]').ekstrakt()

Gornji kôd vraća popis svih div oznake ispod html oznake, samo ako imaju atribut klase s vrijednošću raspon12.

Što ako ne znate vrijednost atributa? A sve što želite je dobiti oznake s određenim atributom, bez brige o njegovoj vrijednosti. I ovo je jednostavno, sve što trebate je koristiti samo simbol @ i atribut.

U [10]: odgovor.xpath ('/ html // div [@class]').ekstrakt()

Ovaj kôd vraća popis svih div oznaka koje sadrže atribut klase bez obzira na vrijednost koju taj atribut klase ima.

Što ako znate samo nekoliko znakova sadržanih u vrijednosti atributa? Također je moguće dobiti takvu vrstu oznaka.

U [11]: odgovor.xpath ('/ html // div [sadrži (@id, "ion")]').ekstrakt()

Gornji kôd vraća sve div oznake ispod html oznake koje imaju atribut id, međutim ne znamo koju vrijednost atribut ima, osim što znamo da sadrži "ion".

Stranica koju raščlanjujemo ima samo jednu oznaku u ovoj kategoriji, a vrijednost je "paginacija" kako bi se vratila.

Cool desno?

OZNAKE PO NJIHOVOM TEKSTU

Imajte na umu da smo ranije podudarali oznake prema njihovim atributima. Oznake možemo podudarati i prema njihovom tekstu.

U [12]: odgovor.xpath ('/ html // a [.= "Alžir"] ').ekstrakt()

Gornji kod bi nam pomogao da dobijemo sve sidrene oznake u kojima je tekst "Alžir". NAPOMENA: To moraju biti oznake s točno tim tekstualnim sadržajem.

Predivno.

Što ako ne znamo točan sadržaj teksta, a znamo samo nekoliko tekstualnih sadržaja? To možemo i mi.

U [13]: odgovor.xpath ('/ html // a [sadrži (tekst (), "A")]').ekstrakt()

Gornji kod dobit će oznake koje u svom tekstualnom sadržaju imaju slovo "A".

IZVLAČENJE SADRŽAJA OZNAKE

Sve vrijeme razgovarali smo o pronalaženju pravih oznaka. Vrijeme je da izdvojimo sadržaj oznake kad je pronađemo.

Prilično je jednostavno. Sve što trebamo učiniti je dodati "/ text ()" u sintaksu, a sadržaj oznake bit će izdvojen.

U [14]: odgovor.xpath ('/ html // a / text ()').ekstrakt()

Gornji kôd će dobiti sve sidrene oznake u html dokumentu, a zatim će izvući tekstni sadržaj.

IZVLAČENJE VEZA

Sad kad znamo kako izdvojiti tekst u oznakama, trebali bismo znati kako izvući vrijednosti atributa. Najčešće su vrijednosti atributa koje su nam od najveće važnosti poveznice.

To je gotovo isto kao i izdvajanje tekstualnih vrijednosti, no umjesto da koristimo "/ text ()", koristili bismo simbol "/ @" i ime atributa.

U [15]: odgovor.xpath ('/ html // a / @ href').ekstrakt()

Gornji kôd izdvojio bi sve veze u sidrenim oznakama, veze bi trebale biti vrijednosti href atribut.

NAVIGACIJA SIBLING TAGOVA

Ako ste primijetili, cijelo vrijeme smo se kretali po oznakama. Međutim, postoji jedna situacija koju nismo riješili.

Kako odabrati određenu oznaku kada su oznake s istim imenom na istoj razini?




Afganistana




Alandski otoci


U slučaju poput ovog koji imamo gore, ako bismo ga pogledali, mogli bismo reći da bismo koristili extract_first () dobiti prvu utakmicu.

Međutim, što ako želimo parirati drugom? Što ako postoji više od deset mogućnosti, a mi želimo petu? Odmah ćemo na to odgovoriti.

Evo rješenja: Kada napišemo sintaksu Xpath, položaj oznake koju želimo stavljamo u uglate zagrade, baš kao što indeksiramo, ali indeks počinje na 1.

Gledajući html web stranice s kojom imamo posla, primijetili biste da ih ima puno oznake na istoj razini. Da biste dobili treće oznaku, koristili bismo sljedeći kod:

U [16]: odgovor.xpath ('/ html // tr [3]').ekstrakt()

Također biste primijetili da oznake su u dvije, ako želimo samo drugu oznake iz redaka učinili bismo sljedeće:

U [17]: odgovor.xpath ('/ html // td [2]').ekstrakt()

ZAKLJUČAK:

Xpath je vrlo moćan način raščlanjivanja html datoteka i mogao bi vam pomoći umanjiti upotrebu regularnih izraza u njihovom raščlanjivanju s obzirom na to da ima sadrži funkcija u svojoj sintaksi.

Postoje i druge knjižnice koje omogućuju raščlanjivanje s Xpatom, poput Selenija, za web automatizaciju. Xpath nam daje puno opcija prilikom raščlanjivanja html-a, ali ono što je obrađeno u ovom članku trebalo bi vas provesti kroz uobičajene operacije raščlanjivanja html-a.

Vodič za OpenTTD
OpenTTD je jedna od najpopularnijih igara za poslovnu simulaciju. U ovoj igri morate stvoriti prekrasan prijevoznički posao. Međutim, počet ćete u poč...
SuperTuxKart za Linux
SuperTuxKart sjajan je naslov osmišljen kako bi vam besplatno pružio iskustvo Mario Kart na vašem Linux sustavu. Prilično je izazovno i zabavno igrati...
Vodič za bitku za Wesnoth
Bitka za Wesnoth jedna je od najpopularnijih strateških igara otvorenog koda koje trenutno možete igrati. Ne samo da se ova igra razvija već jako dugo...