Skrapig

Skrapigt med XPath-väljare

Skrapigt med XPath-väljare
HTML är språket på webbsidorna och det finns mycket information mellan varje webbsides öppning och stängning html märka. Det finns många sätt att komma åt detta, men i den här artikeln skulle vi göra det med hjälp av Xpath-väljaren genom Pythons Scrapy-bibliotek.

Scrapy-biblioteket är ett mycket kraftfullt webbskrapningsbibliotek, lätt att använda också. Om du är ny på detta kan du följa den tillgängliga handboken om hur du använder Scrapy-biblioteket.

Denna handledning täcker användningen av Xpath-väljare. Xpath använder sökväg som syntax för att navigera i XML-dokumentens noder. De är också användbara för att navigera i HTML-taggar.

Till skillnad från Scrapy-handboken kommer vi att göra alla våra aktiviteter här på terminalen för enkelhets skull. Detta betyder inte att Xpath inte kan användas med rätt Scrapy-program, de kan dock användas i analysbiblioteket på svarsparametern.

Vi kommer att arbeta med exemplet.webbskrapning.com-webbplats, eftersom det är väldigt enkelt och skulle hjälpa till att förstå begreppen.

För att använda scrapy i vår terminal, skriv in kommandot nedan:

$ scrapy shell http: // exempel.webbskrapning.com

Det skulle besöka webbplatsen och få den information som behövs och sedan lämna oss ett interaktivt skal att arbeta med. Du bör se en fråga som:

I 1]:

Från den interaktiva sessionen kommer vi att arbeta med svar objekt.

Här är hur vår syntax skulle se ut för majoriteten av den här artikeln:

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

Det här kommandot ovan används för att extrahera alla matchade taggar enligt Xpath-syntaxen och sedan lagra det i en lista.

I [2]: svar.xpath ('xpathsyntax').extrahera (första)

Det här kommandot ovan används för att extrahera endast den första matchade taggen och lagra den i en lista.
Vi kan nu börja arbeta med Xpath-syntaxen.

NAVIGERANDE MÄRKEN

Att navigera taggar i Xpath är väldigt enkelt, allt som behövs är snedstrecket "/" följt av namnet på taggen.

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

Kommandot ovan skulle returnera html tagg och allt det innehåller som ett enda objekt i en lista.

Om vi ​​vill hämta webbsidans innehåll använder vi följande:

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

Xpath tillåter också jokerteckenet "*", som matchar allt på nivån där det används.

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

Koden ovan skulle matcha allt i dokumentet. Samma sak händer när vi använder '/ html'.

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

Förutom att navigera taggar kan vi hämta alla efterkommande taggar för en viss tagg med hjälp av "//".

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

Ovanstående kod returnerar alla ankertaggar under i html-taggen i.e. det skulle returnera en lista med alla efterkommande ankartaggar.

MÄRKNINGAR FÖR ATTRIBUTER OCH DINA VÄRDEN

Ibland kan det vara problem att navigera i html-taggar för att komma till önskad tagg. Detta problem kan avvärjas genom att helt enkelt hitta den nödvändiga taggen med dess attribut.

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

Koden ovan returnerar alla div taggar under html tagg som har id attribut med värdet paginering.

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

Koden ovan skulle returnera en lista över alla div taggar under html-taggen, bara om de har klassattributet med värdet span12.

Vad händer om du inte vet attributets värde? Och allt du vill är att få taggar med ett visst attribut, utan att oroa sig för dess värde. Att göra detta är också enkelt, allt du behöver göra är att bara använda symbolen @ och attributet.

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

Den här koden returnerar en lista med alla div-taggar som innehåller klassattributet oavsett vilket värde klassattributet innehåller.

Vad sägs om du bara vet ett par tecken som ingår i värdet på ett attribut? Det är också möjligt att få tag på den typen av taggar.

I [11]: svar.xpath ('/ html // div [innehåller (@id, "jon")]').extrahera()

Koden ovan skulle returnera alla div-taggar under html-taggen som har id-attributet, men vi vet inte vilket värde attributet har förutom att vi vet att det innehåller "ion".

Sidan vi analyserar har bara en tagg i den här kategorin, och värdet är "pagination" så det skulle returneras.

Cool rätt?

MÄRKNINGAR EFTER TEXTEN

Kom ihåg att vi matchade taggar efter deras attribut tidigare. Vi kan också matcha taggar efter deras text.

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

Koden ovan skulle hjälpa oss att få alla ankartaggar som har texten "Algeriet". OBS: Det måste vara taggar med exakt det textinnehållet.

Underbar.

Vad sägs om vi inte vet det exakta textinnehållet, och vi bara känner till några få av textinnehållet? Vi kan också göra det.

I [13]: svar.xpath ('/ html // a [innehåller (text (), "A")]').extrahera()

Koden ovan skulle få taggarna som har bokstaven "A" i sitt textinnehåll.

UTTAGANDE TAGINNEHÅLL

Hela tiden har vi pratat om att hitta rätt taggar. Det är dags att extrahera taggens innehåll när vi hittar det.

Det är ganska enkelt. Allt vi behöver göra är att lägga till “/ text ()” till syntaxen, och taggens innehåll extraheras.

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

Koden ovan skulle få alla ankartaggar i html-dokumentet och extrahera sedan textinnehållet.

EXTRERA LÄNKARNA

Nu när vi vet hur man extraherar texten i taggar, bör vi veta hur man extraherar attributens värden. De flesta gånger är värdena för attribut som är av yttersta vikt för oss länkar.

Att göra detta är nästan detsamma som att extrahera textvärdena, men istället för att använda “/ text ()” skulle vi använda “/ @” symbolen och namnet på attributet.

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

Koden ovan skulle extrahera alla länkarna i ankartaggarna, länkarna ska vara värdena för href attribut.

NAVIGERAR SJÖBILSTAGGAR

Om du märkte det har vi navigerat taggar allt detta. Det finns dock en situation som vi inte har tacklat.

Hur väljer vi en viss tagg när taggar med samma namn är på samma nivå?




Afghanistan




Åland


I ett fall som det vi har ovan, om vi ska titta på det, kan vi säga att vi skulle använda extrahera (första) för att få den första matchen.

Men vad händer om vi vill matcha den andra? Vad händer om det finns mer än tio alternativ och vi vill ha det femte? Vi kommer att svara på det just nu.

Här är lösningen: När vi skriver vår Xpath-syntax sätter vi positionen för taggen vi vill ha inom parentes, precis som vi indexerar men indexet börjar vid 1.

Om du tittar på html på webbsidan vi har att göra med, skulle du märka att det finns mycket taggar på samma nivå. Att få den tredje tagg, skulle vi använda följande kod:

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

Du skulle också märka att taggar är i två, om vi bara vill ha den andra taggar från rader skulle vi göra följande:

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

SLUTSATS:

Xpath är ett mycket kraftfullt sätt att analysera html-filer och kan hjälpa till att minimera användningen av reguljära uttryck för att analysera dem med tanke på att den har innehåller funktion i sin syntax.

Det finns andra bibliotek som tillåter parsning med Xpath som Selenium för webbautomation. Xpath ger oss många alternativ när du analyserar html, men vad som har behandlats i den här artikeln borde kunna föra dig igenom vanliga html-parsningsoperationer.

Topp 10 spel att spela på Ubuntu
Windows-plattformen har varit en av de dominerande plattformarna för spel på grund av den enorma andelen spel som utvecklas idag för att stödja Window...
5 bästa arkadspel för Linux
Numera är datorer seriösa maskiner som används för spel. Om du inte kan få den nya poängen vet du vad jag menar. I det här inlägget kommer du att känn...
Strid om Wesnoth 1.13.6 Utveckling släppt
Strid om Wesnoth 1.13.6 släpptes förra månaden, är den sjätte utvecklingsversionen i 1.13.x-serien och den levererar ett antal förbättringar, framför ...