Knižnica Scrapy je veľmi výkonná knižnica na scraping webových aplikácií, ktorá sa tiež ľahko používa. Ak ste v tejto oblasti nováčikom, môžete postupovať podľa dostupného tutoriálu o používaní knižnice Scrapy.
Tento výukový program sa venuje použitiu selektorov Xpath. Xpath používa cestu ako syntax na navigáciu v uzloch dokumentov XML. Sú užitočné aj pri navigácii v značkách HTML.
Na rozdiel od tutoriálu Scrapy, budeme tu pre zjednodušenie robiť všetky naše operácie tu na termináli. To neznamená, že Xpath nemožno použiť so správnym programom Scrapy, ale je možné ich použiť v knižnici syntaktickej analýzy parametra odpovede.
Budeme pracovať s príkladom.webcraping.com, pretože je veľmi jednoduchý a pomohol by pochopiť pojmy.
Ak chcete v našom termináli použiť scrapy, zadajte nasledujúci príkaz:
$ scrapy shell http: // príklad.webcraping.comNavštívila by stránku a získala potrebné informácie, potom by nám nechala interaktívny shell, s ktorým by sme mohli pracovať. Mali by ste vidieť výzvu ako:
V [1]:Z interaktívnej relácie budeme pracovať s odpoveď objekt.
Takto by vyzerala naša syntax pre väčšinu tohto článku:
V [1]: odpoveď.xpath ('xpathsyntax').extrakt ()Tento príkaz vyššie sa používa na extrahovanie všetkých zhodných značiek podľa syntaxe Xpath a ich uloženie do zoznamu.
In [2]: response.xpath ('xpathsyntax').extract_first ()Tento príkaz vyššie sa používa na extrahovanie iba prvej zhodnej značky a jej uloženie do zoznamu.
Teraz môžeme začať pracovať na syntaxi Xpath.
NAVIGAČNÉ ZNAČKY
Navigácia v značkách v Xpath je veľmi jednoduchá, všetko, čo potrebujete, je lomka „/“, za ktorou nasleduje názov značky.
In [3]: response.xpath ('/ html').extrakt ()Vyššie uvedený príkaz vráti príkaz html tag a všetko, čo obsahuje, ako jednu položku v zozname.
Ak chceme získať text webovej stránky, použili by sme nasledujúce:
In [4]: response.xpath ('/ html / body').extrakt ()Xpath umožňuje aj zástupný znak „*“, ktorý sa zhoduje so všetkým na úrovni, v ktorej sa používa.
In [5]: response.xpath ('/ *').extrakt ()Vyššie uvedený kód by zodpovedal všetkému v dokumente. To isté sa stane, keď použijeme '/ html'.
In [6]: response.xpath ('/ html / *').extrakt ()Okrem navigácie v značkách môžeme pomocou značky „//“ získať všetky nasledujúce značky konkrétnej značky.
In [7]: response.xpath ('/ html // a').extrakt ()Vyššie uvedený kód vráti všetky kotviace značky pod v html značke i.e. vrátilo by to zoznam všetkých potomkov kotviacich značiek.
ZNAČKY ATRIBÚTOV A ICH HODNOTY
Niekedy môže byť problém s navigáciou v značkách HTML, aby ste sa dostali k požadovanej značke. Týmto problémom je možné zabrániť jednoduchým nájdením potrebnej značky podľa jej atribútu.
In [8]: response.xpath ('/ html // div [@id = "stránkovanie"]').extrakt ()Vyššie uvedený kód vráti všetky div značky pod html značka, ktorá má id atribút s hodnotou stránkovanie.
In [9]: response.xpath ('/ html // div [@class = "span12"]').extrakt ()Vyššie uvedený kód vráti zoznam všetkých súborov div značky pod značkou html, iba ak majú atribút triedy s hodnotou span12.
Čo ak nepoznáte hodnotu atribútu? Všetko, čo chcete, je získať značky s konkrétnym atribútom bez obáv o ich hodnotu. Toto je tiež jednoduché, všetko, čo musíte urobiť, je použiť iba symbol @ a atribút.
In [10]: response.xpath ('/ html // div [@class]').extrakt ()Tento kód vráti zoznam všetkých značiek div, ktoré obsahujú atribút triedy, bez ohľadu na to, akú hodnotu má tento atribút triedy.
Čo na tom, ak poznáte iba pár znakov obsiahnutých v hodnote atribútu? Je tiež možné získať tieto typy značiek.
In [11]: response.xpath ('/ html // div [obsahuje (@id, "ion")]').extrakt ()Vyššie uvedený kód vráti všetky značky div pod značkou html, ktoré majú atribút id, avšak nevieme, akú hodnotu má atribút, ibaže vieme, že obsahuje „ion“.
Stránka, ktorú analyzujeme, má v tejto kategórii iba jednu značku a hodnota je „stránkovanie“, takže by bola vrátená.
Super správne?
ZNAČKY PODĽA ICH TEXTU
Pamätajte, že sme značky priradili skôr podľa ich atribútov. Značky môžeme priradiť aj podľa ich textu.
In [12]: response.xpath ('/ html // a [.= "Alžírsko"] ')).extrakt ()Vyššie uvedený kód by nám pomohol získať všetky kotviace značky, ktoré majú v sebe text „Alžírsko“. Pozn .: Musí to byť značka s presne týmto textovým obsahom.
Úžasné.
Čo na tom, ak nevieme presný textový obsah a poznáme iba zopár textového obsahu? Môžeme to urobiť tiež.
In [13]: response.xpath ('/ html // a [obsahuje (text (), "A")]').extrakt ()Vyššie uvedený kód by získal značky, ktoré majú v textovom obsahu písmeno „A“.
OBSAH VYŤAHUJÚCEHO ZNAČKY
Celý čas sme hovorili o hľadaní správnych značiek. Je čas extrahovať obsah značky, keď ju nájdeme.
Je to celkom jednoduché. Všetko, čo musíme urobiť, je pridať do syntaxe „/ text ()“ a obsah značky by sa extrahoval.
V [14]: odpoveď.xpath ('/ html // a / text ()').extrakt ()Vyššie uvedený kód by získal všetky ukotvovacie značky v html dokumente a potom extrahoval textový obsah.
ŤAŽBA ODKAZOV
Teraz, keď vieme, ako extrahovať text v značkách, by sme mali vedieť, ako extrahovať hodnoty atribútov. Hodnoty atribútov, ktoré sú pre nás najdôležitejšie, sú väčšinou odkazy.
Toto je takmer to isté ako extrahovanie textových hodnôt, ale namiesto použitia „/ text ()“ by sme použili symbol „/ @“ a názov atribútu.
In [15]: response.xpath ('/ html // a / @ href").extrakt ()Vyššie uvedený kód by extrahoval všetky odkazy v kotviacich značkách, odkazy by mali byť hodnotami href atribút.
NAVIGÁCIA SÚBORNÝCH ZNAČIEK
Ak ste si všimli, po celú túto dobu prechádzame značky. Existuje však jedna situácia, ktorú sme neriešili.
Ako vyberieme konkrétnu značku, keď sú značky s rovnakým názvom na rovnakej úrovni?
V prípade, ako je ten, ktorý máme vyššie, sa na to môžeme pozrieť, mohli by sme povedať, že použijeme extract_first () získať prvý zápas.
Čo však, ak sa chceme vyrovnať tomu druhému? Čo ak je možností viac ako desať a my chceme piatu? Na to si odpovieme práve teraz.
Toto je riešenie: Keď píšeme svoju syntax Xpath, dáme pozíciu značky, ktorú chceme, do hranatých zátvoriek, rovnako ako indexujeme, ale index začína na 1.
Pri pohľade na html webovej stránky, s ktorou pracujeme, by ste si všimli, že je toho naozaj veľa
Tiež by ste si všimli, že
ZÁVER:
Xpath je veľmi efektívny spôsob analýzy súborov html a môže pomôcť minimalizovať použitie regulárnych výrazov pri ich analýze, pretože má obsahuje funkcia vo svojej syntaxi.
Existujú aj ďalšie knižnice, ktoré umožňujú analýzu pomocou Xpath, napríklad Selenium, pre automatizáciu webu. Xpath nám poskytuje veľa možností pri analýze html, ale to, čo bolo popísané v tomto článku, by malo byť schopné previesť vás cez bežné operácie syntaktickej analýzy html.