Skrap med xpath -velgere

Skrap med xpath -velgere
HTML er språket på websidene, og det henger mye informasjon mellom hver webside åpning og lukking html stikkord. Det er mange måter å få tilgang til dette, men i denne artikkelen vil vi gjøre det ved å bruke XPath -velgeren gjennom Pythons Scrapy Library.

Scrapy Library er et veldig kraftig skrapingsbibliotek for nettet, enkelt å bruke også. Hvis du er ny på dette, kan du følge den tilgjengelige opplæringen om å bruke Scrapy Library.

Denne opplæringen dekker bruken av XPath -velgere. XPath bruker sti som syntaks for å navigere i nodene til XML -dokumenter. De er også nyttige i å navigere i HTML -tagger.

I motsetning til i den skrape opplæringen, skal vi gjøre alle våre operasjoner her på terminalen for enkelhets skyld. Dette betyr ikke at XPath ikke kan brukes med riktig skrapeprogram, men de kan brukes i Parse -biblioteket på responsparameteren.

Vi skal jobbe med eksemplet.webskraping.com nettsted, da det er veldig enkelt og vil hjelpe til med å forstå konseptene.

For å bruke skrapi i terminalen vår, skriv inn kommandoen nedenfor:

$ Scrapy Shell http: // Eksempel.webskraping.com

Den ville besøke nettstedet og få den nødvendige informasjonen, og deretter la oss være med et interaktivt skall å jobbe med. Du bør se en rask som:

I [1]:

Fra den interaktive økten skal vi jobbe med respons gjenstand.

Her er hvordan syntaksen vår vil se ut for flertallet av denne artikkelen:

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

Denne kommandoen ovenfor brukes til å trekke ut alle de matchede kodene i henhold til XPath -syntaksen og lagrer den deretter i en liste.

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

Denne kommandoen ovenfor brukes til å trekke ut bare den første matchede taggen, og lagrer den i en liste.
Vi kan nå begynne å jobbe med XPath Syntax.

Navigering av tagger

Navigering av tagger i XPath er veldig enkelt, alt som trengs er det fremover-slash "/" etterfulgt av navnet på taggen.

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

Kommandoen over ville returnere html Tag og alt det inneholder som et enkelt element i en liste.

Hvis vi ønsker å få kroppen på websiden, vil vi bruke følgende:

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

XPath tillater også jokertegnets "*", som samsvarer med alt i det nivået det brukes.

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

Koden over vil samsvare med alt i dokumentet. Det samme skjer når vi bruker '/html'.

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

Bortsett fra å navigere på tagger, kan vi få alle etterkommerne av en bestemt tag ved å bruke “//”.

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

Ovennevnte kode vil returnere alle ankerkodene under i HTML -taggen i.e. Det ville returnere en liste over alle etterkommere -ankerkodene.

Tagger etter attributter og deres verdier

Noen ganger kan det være problemer med å navigere i HTML -tagger for å komme til den nødvendige taggen. Denne problemer kan avverges ved ganske enkelt å finne den nødvendige taggen med attributtet.

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

Koden over returnerer alle div Tagger under html Taggen som har id attributt med en verdi av paginering.

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

Koden over ville returnere en liste over alle div Tagger under HTML -taggen, bare hvis de har klasseattributtet med en verdi av Span12.

Hva om du ikke vet verdien av attributtet? Og alt du ønsker er å få tagger med en bestemt attributt, uten bekymring for verdien. Å gjøre dette er enkelt også, alt du trenger å gjøre er å bare bruke @ -symbolet og attributtet.

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

Denne koden vil returnere en liste over alle DIV -tagger som inneholder klasseattributtet uavhengig av hvilken verdi som klasseattributtet har.

Hva med hvis du bare vet et par tegn som er inneholdt i verdien av en attributt? Det er også mulig å få den typen tagger.

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

Koden over vil returnere alle DIV -kodene under HTML -taggen som har ID -attributtet, men vi vet ikke hvilken verdi attributtet har bortsett fra at vi vet at den inneholder "ion".

Siden vi analyserer har bare en tag i denne kategorien, og verdien er "paginering", så den vil bli returnert.

Kult riktig?

Tagger etter teksten deres

Husk at vi matchet tagger etter attributtene deres tidligere. Vi kan også matche tagger etter teksten deres.

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

Koden over vil hjelpe oss å få alle ankerkodene som har “Algerie” -teksten i dem. NB: Det må være tagger med akkurat det tekstinnholdet.

Herlig.

Hva med om vi ikke vet i det nøyaktige tekstinnholdet, og vi vet bare noen få av tekstinnholdet? Vi kan gjøre det også.

I [13]: svar.xpath ('/html // a [inneholder (tekst (), "a")]').ekstrakt()

Koden over vil få taggene som har bokstaven “A” i tekstinnholdet.

Trekke ut taginnhold

Hele tiden har vi snakket om å finne de riktige taggene. Det er på tide å trekke ut innholdet i taggen når vi finner det.

Det er ganske enkelt. Alt vi trenger å gjøre er å legge til "/tekst ()" til syntaks, og innholdet i taggen vil bli trukket ut.

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

Koden over vil få alle ankerkodene i HTML -dokumentet, og deretter trekke ut tekstinnholdet.

Trekke ut lenkene

Nå som vi vet hvordan vi skal trekke ut teksten i tagger, bør vi vite hvordan vi skal trekke ut verdiene til attributter. De fleste ganger er verdiene til attributter som er av største betydning for oss lenker.

Å gjøre dette er nesten det samme som å trekke ut tekstverdiene, men i stedet for å bruke "/text ()" ville vi bruke “/@” -symbolet og navnet på attributtet.

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

Koden over vil trekke ut alle koblingene i ankerkodene, koblingene skal visstnok være verdiene til href Egenskap.

Navigering av søskenkoder

Hvis du la merke til det, har vi navigert på tagger alt dette mens. Imidlertid er det en situasjon vi ikke har taklet.

Hvordan velger vi en bestemt tag når tagger med samme navn er på samme nivå?




Afghanistan




Alandøyene


I en sak som den vi har ovenfor, hvis vi skal se på det, kan vi si at vi ville brukt EXTRACT_FIRST () For å få den første kampen.

Men hva om vi vil matche den andre? Hva om det er mer enn ti alternativer og vi vil ha den femte? Vi kommer til å svare på det akkurat nå.

Her er løsningen: Når vi skriver XPath -syntaksen, legger vi plasseringen av taggen vi ønsker i firkantede parenteser, akkurat som vi indekserer, men indeksen starter på 1.

Når du ser på HTML på websiden vi har å gjøre med, vil du legge merke til at det er mye Tagger på samme nivå. For å få den tredje Tag, vi vil bruke følgende kode:

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

Du vil også legge merke til at Tagger er i to, hvis vi bare vil ha det andre Tagger fra Rader vi ville gjort følgende:

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

KONKLUSJON:

XPath er en veldig kraftig måte å analysere HTML -filer på, og kan bidra til å minimere bruken av vanlige uttrykk for å analysere dem med tanke på at den har inneholder funksjon i syntaks.

Det er andre biblioteker som tillater analysering med XPath som Selenium for nettautomatisering. XPath gir oss mange alternativer mens vi analyserer HTML, men det som har blitt behandlet i denne artikkelen, skal kunne føre deg gjennom vanlige HTML -parsingoperasjoner.