Skrapete

Skrapete med XPath-valg

Skrapete med XPath-valg
HTML er språket på websidene, og det henger mye informasjon mellom hver nettsides å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-bibliotek.

Scrapy-biblioteket er et veldig kraftig nettskrapebibliotek, også enkelt å bruke. Hvis du er ny på dette, kan du følge den tilgjengelige opplæringen om bruk av Scrapy-biblioteket.

Denne veiledningen dekker bruken av Xpath-velgerne. Xpath bruker bane som syntaks for å navigere i noder i XML-dokumenter. De er også nyttige når du navigerer i HTML-koder.

I motsetning til i Scrapy-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 Scrapy-program, men de kan brukes i analysebiblioteket på svarparameteren.

Vi skal jobbe med eksemplet.webscraping.com-siden, siden det er veldig enkelt og vil hjelpe forstå begrepene.

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

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

Det ville besøke nettstedet og få nødvendig informasjon, og etterlate oss med et interaktivt skall å jobbe med. Du bør se en melding som:

I [1]:

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

Slik ser syntaksen vår ut for flertallet av denne artikkelen:

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

Denne kommandoen ovenfor brukes til å trekke ut alle de samsvarende kodene i henhold til Xpath-syntaksen og deretter lagre den i en liste.

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

Denne kommandoen ovenfor brukes til å trekke ut bare den første matchede koden, og lagrer den i en liste.
Vi kan nå begynne å jobbe med Xpath-syntaksen.

NAVIGERINGSMERKER

Navigering av koder i Xpath er veldig enkelt, alt som trengs er skråstrek “/” etterfulgt av navnet på koden.

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

Kommandoen ovenfor vil returnere html tag og alt det inneholder som et enkelt element i en liste.

Hvis vi ønsker å få hoveddelen av websiden, vil vi bruke følgende:

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

Xpath tillater også jokertegnet “*”, som samsvarer med alt i nivået det brukes i.

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

Koden ovenfor samsvarer med alt i dokumentet. Det samme skjer når vi bruker '/ html'.

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

I tillegg til å navigere på tagger, kan vi få alle etterkommende tagger til en bestemt tag ved å bruke "//".

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

Ovennevnte kode vil returnere alle ankerkodene under i html-koden i.e. det vil returnere en liste over alle etterkommende ankermerker.

MERKER AV ATTRIBUTER OG DERES VERDIER

Noen ganger kan det være problemer å navigere i html-koder for å komme til den nødvendige koden. Dette problemet kan avverges ved ganske enkelt å finne den nødvendige koden etter attributtet.

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

Koden ovenfor returnerer alle div koder under html tag som har id attributt med verdien paginering.

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

Koden ovenfor vil returnere en liste over alle div koder under html-koden, bare hvis de har klasseattributtet med verdien span12.

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

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

Denne koden returnerer en liste over alle div-kodene som inneholder klasseattributtet, uavhengig av hvilken verdi klasseattributtet har.

Hva med om du bare vet et par tegn som inneholder verdien av et attributt? Det er også mulig å få den typen koder.

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

Koden ovenfor 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 "pagination", så den vil bli returnert.

Kult rett?

MERKER AV TEKSTEN

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

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

Koden ovenfor vil hjelpe oss med å få alle ankerkodene som har "Algerie" -teksten. NB: Det må være koder med akkurat det tekstinnholdet.

Herlig.

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

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

Koden ovenfor får kodene som har bokstaven “A” i tekstinnholdet.

UTTAKKENDE TAGINNHOLD

Hele tiden har vi snakket om å finne de riktige kodene. Det er på tide å trekke ut innholdet i koden når vi finner den.

Det er ganske enkelt. Alt vi trenger å gjøre er å legge til "/ text ()" til syntaksen, og innholdet i koden blir ekstrahert.

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

Koden ovenfor vil få alle ankerkodene i html-dokumentet, og deretter pakke ut tekstinnholdet.

Trekke ut lenkene

Nå som vi vet hvordan vi skal trekke ut teksten i koder, bør vi vite hvordan vi trekker 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 ()” bruker vi “/ @” -symbolet og navnet på attributtet.

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

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

NAVIGERER SJØBILMERKER

Hvis du la merke til det, har vi navigert i tagger alt dette. 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




Ålandsøyene


I et tilfelle som det vi har ovenfor, hvis vi skal se på det, kan vi si at vi vil bruke 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 skal svare på det akkurat nå.

Her er løsningen: Når vi skriver Xpath-syntaksen, setter vi posisjonen til koden vi vil ha i parentes, akkurat som vi indekserer, men indeksen starter ved 1.

Ser du 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 , bruker vi 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 koder fra rader vil vi gjøre 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 sin syntaks.

Det er andre biblioteker som tillater parsing med Xpath, for eksempel Selen for nettautomatisering. Xpath gir oss mange alternativer mens du analyserer html, men det som har blitt behandlet i denne artikkelen, burde kunne føre deg gjennom vanlige html-parseringsoperasjoner.

Installer det siste OpenRA-strategispillet på Ubuntu Linux
OpenRA er en Libre / Free Real Time Strategy-spillmotor som gjenskaper de tidlige Westwood-spillene som den klassiske Command & Conquer: Red Alert. Di...
Installer nyeste Dolphin Emulator for Gamecube & Wii på Linux
Dolphin Emulator lar deg spille de valgte Gamecube- og Wii-spillene dine på Linux Personal Computers (PC). Som en fritt tilgjengelig og åpen kildekod...
Hvordan bruke GameConqueror Cheat Engine i Linux
Artikkelen dekker en guide om bruk av GameConqueror-juksemotoren i Linux. Mange brukere som spiller spill på Windows bruker ofte "Cheat Engine" -appli...