Skrap

Scrapy med XPath Selectors

Scrapy med XPath Selectors
HTML er websides sprog, og der hænger meget information mellem hver websides åbning og lukning html tag. Der er mange måder at få adgang til dette, men i denne artikel ville vi gøre det ved hjælp af Xpath-vælger gennem Pythons Scrapy-bibliotek.

Scrapy-biblioteket er et meget kraftigt webskrabebibliotek, som også er let at bruge. Hvis du er ny på dette, kan du følge den tilgængelige vejledning om brug af Scrapy-biblioteket.

Denne vejledning dækker brugen af ​​Xpath-vælgere. Xpath bruger sti som syntaks til at navigere i noder i XML-dokumenter. De er også nyttige til at navigere i HTML-tags.

I modsætning til Scrapy-tutorialen skal vi udføre alle vores operationer her på terminalen for enkelheds skyld. Dette betyder ikke, at Xpath ikke kan bruges med det rigtige Scrapy-program, men de kan bruges i parsebiblioteket på svarparameteren.

Vi skal arbejde med eksemplet.webscraping.com site, da det er meget simpelt og kan hjælpe med at forstå begreberne.

For at bruge scrapy i vores terminal skal du skrive kommandoen nedenfor:

$ scrapy shell http: // eksempel.webscraping.com

Det ville besøge webstedet og få de nødvendige oplysninger og derefter lade os have en interaktiv skal at arbejde med. Du skal se en prompt som:

I [1]:

Fra den interaktive session skal vi arbejde med respons objekt.

Sådan ser vores syntaks ud for størstedelen af ​​denne artikel:

I [1]: svar.xpath ('xpathsyntax').uddrag()

Denne kommando ovenfor bruges til at udtrække alle de matchede tags i henhold til Xpath-syntaksen og derefter gemme den på en liste.

I [2]: svar.xpath ('xpathsyntax').extract_first ()

Denne kommando ovenfor bruges til kun at udtrække det første matchede tag og gemme det på en liste.
Vi kan nu begynde at arbejde på Xpath-syntaksen.

NAVIGERENDE MÆRKER

Navigering af tags i Xpath er meget let, alt hvad der er nødvendigt er skråstreg “/” efterfulgt af navnet på tagget.

I [3]: svar.xpath ('/ html').uddrag()

Kommandoen ovenfor ville returnere html tag og alt det indeholder som et enkelt element på en liste.

Hvis vi vil hente brødteksten på websiden, bruger vi følgende:

I [4]: ​​svar.xpath ('/ html / body').uddrag()

Xpath tillader også jokertegnet “*”, som matcher alt i det niveau, det bruges i.

I [5]: svar.xpath ('/ *').uddrag()

Koden ovenfor ville matche alt i dokumentet. Den samme ting sker, når vi bruger '/ html'.

I [6]: svar.xpath ('/ html / *').uddrag()

Bortset fra navigering af tags kan vi hente alle efterfølgende tags for et bestemt tag ved hjælp af "//".

I [7]: svar.xpath ('/ html // a').uddrag()

Ovenstående kode returnerer alle ankerkoder under i html-koden i.e. det ville returnere en liste med alle efterfølgende ankermærker.

MÆRKNINGER VED ATTRIBUTER OG DERES VÆRDIER

Nogle gange kan det være vanskeligt at navigere i html-tags for at komme til det krævede tag. Denne fejl kan afværges ved simpelthen at finde det nødvendige mærke ved hjælp af dets attribut.

I [8]: svar.xpath ('/ html // div [@id = "pagination"]').uddrag()

Koden ovenfor returnerer alle div tags under html tag, der har id attribut med en værdi på pagination.

I [9]: svar.xpath ('/ html // div [@class = "span12"]').uddrag()

Koden ovenfor vil returnere en liste over alle div tags under html-tagget, kun hvis de har klasseattributten med en værdi på span12.

Hvad hvis du ikke kender værdien af ​​attributten? Og alt hvad du ønsker er at få tags med en bestemt attribut uden bekymring for dens værdi. At gøre dette er også enkelt, alt hvad du skal gøre er kun at bruge @ symbolet og attributten.

I [10]: svar.xpath ('/ html // div [@class]').uddrag()

Denne kode returnerer en liste over alle div-tags, der indeholder klasseattributten uanset hvilken værdi den klasseattribut har.

Hvad med hvis du kun kender et par tegn indeholdt i værdien af ​​en attribut? Det er også muligt at få denne type tags.

I [11]: svar.xpath ('/ html // div [indeholder (@id, "ion")]').uddrag()

Koden ovenfor returnerer alle div-tags under html-tagget, der har id-attributten, men vi ved ikke, hvilken værdi attributten har, bortset fra at vi ved, at den indeholder "ion".

Den side, vi analyserer, har kun et tag i denne kategori, og værdien er "pagination", så den returneres.

Cool lige?

MÆRKNINGER EFTER TEKSTEN

Husk, at vi matchede tags efter deres attributter tidligere. Vi kan også matche tags efter deres tekst.

I [12]: svar.xpath ('/ html // a [.= "Algeriet"] ').uddrag()

Koden ovenfor vil hjælpe os med at få alle de ankermærker, der indeholder "Algeriet" -teksten. NB: Det skal være tags med præcis det tekstindhold.

Vidunderlig.

Hvad med, hvis vi ikke ved det nøjagtige tekstindhold, og vi kun kender nogle få af tekstindholdet? Vi kan også gøre det.

I [13]: svar.xpath ('/ html // a [indeholder (tekst (), "A")]').uddrag()

Koden ovenfor får de tags, der har bogstavet “A” i deres tekstindhold.

UDTAGENDE TAG INDHOLD

Hele tiden har vi talt om at finde de rigtige tags. Det er tid til at udtrække indholdet af tagget, når vi finder det.

Det er ret simpelt. Alt, hvad vi skal gøre, er at tilføje “/ text ()” til syntaksen, og indholdet af tagget vil blive ekstraheret.

I [14]: svar.xpath ('/ html // a / text ()').uddrag()

Koden ovenfor får alle ankerkoder i html-dokumentet og udpakker derefter tekstindholdet.

UDTAGNING AF LINKERNE

Nu hvor vi ved, hvordan man udpakker teksten i tags, skal vi vide, hvordan man udtrækker værdierne for attributter. De fleste gange er værdierne for attributter, der er af største betydning for os, links.

At gøre dette er næsten det samme som at udtrække tekstværdierne, men i stedet for at bruge “/ text ()” bruger vi “/ @” symbolet og navnet på attributten.

I [15]: svar.xpath ('/ html // a / @ href').uddrag()

Koden ovenfor ville udtrække alle linkene i ankermærkerne, linkene skulle være værdierne for href attribut.

NAVIGERENDE SØGLESKILTER

Hvis du har bemærket, har vi navigeret i tags alt dette. Der er dog en situation, som vi ikke har tacklet.

Hvordan vælger vi et bestemt tag, når tags med samme navn er på samme niveau?




Afghanistan




Ålandsøerne


I et tilfælde som det, vi har ovenfor, hvis vi skal se på det, kan vi måske sige, at vi ville bruge extract_first () for at få den første kamp.

Men hvad hvis vi vil matche den anden? Hvad hvis der er mere end ti muligheder, og vi vil have den femte? Vi vil besvare det lige nu.

Her er løsningen: Når vi skriver vores Xpath-syntaks, sætter vi placeringen af ​​det mærke, vi ønsker, i firkantede parenteser, ligesom vi indekserer, men indekset starter ved 1.

Ser man på html på den webside, vi har at gøre med, vil du bemærke, at der er meget tags på samme niveau. At få det tredje tag, vi bruger følgende kode:

I [16]: svar.xpath ('/ html // tr [3]').uddrag()

Du vil også bemærke, at tags er i to, hvis vi kun vil have det andet tags fra rækker ville vi gøre følgende:

I [17]: svar.xpath ('/ html // td [2]').uddrag()

KONKLUSION:

Xpath er en meget kraftfuld måde at analysere html-filer på og kan hjælpe med at minimere brugen af ​​regulære udtryk til at analysere dem i betragtning af at det har indeholder funktion i sin syntaks.

Der er andre biblioteker, der tillader parsing med Xpath, såsom Selen til webautomation. Xpath giver os mange muligheder under parsing af html, men hvad der er blevet behandlet i denne artikel, burde være i stand til at gennemføre almindelige html-parsingsoperationer.

Sådan registreres og streames din gaming-session på Linux
Tidligere blev spil kun betragtet som en hobby, men med tiden oplevede spilindustrien en enorm vækst med hensyn til teknologi og antallet af spillere....
Bedste spil at spille med håndsporing
Oculus Quest introducerede for nylig den gode idé om håndsporing uden controllere. Med et stadigt stigende antal spil og aktiviteter, der udfører supp...
Sådan vises OSD-overlay i fuldskærms Linux-apps og -spil
Afspilning af fuldskærmsspil eller brug af apps i distraktionsfri fuldskærmstilstand kan afskære dig fra relevante systemoplysninger, der er synlige i...