Analýza súborov XML má dva hlavné aspekty. Oni sú:
- Hľadanie značiek
- Extrahovanie zo značiek
Budete musieť nájsť značku, ktorá obsahuje požadované informácie, a potom tieto informácie extrahovať. Pred koncom tohto článku sa dozviete, ako postupovať pri práci so súbormi XML.
Inštalácia
BeautifulSoup je jednou z najpoužívanejších knižníc, pokiaľ ide o scraping webu pomocou Pythonu. Pretože súbory XML sú podobné súborom HTML, je možné ich tiež analyzovať. Na syntaktickú analýzu súborov XML pomocou programu BeautifulSoup je však najlepšie použiť Python lxml parser.
Obidve knižnice môžete nainštalovať pomocou pip pomocou nasledujúceho príkazu:
pip nainštalujte bs4 lxmlAk chcete potvrdiť, že obe knižnice sú úspešne nainštalované, môžete aktivovať interaktívny shell a pokúsiť sa importovať obe. Ak sa nezobrazí žiadna chyba, ste pripravení ísť so zvyškom článku.
Tu je príklad:
$ pythonPython 3.7.4 (tagy / v3.7.4: e09359112e, 8. júla 2019, 20:34:20)
[MSC v.1916 64 bit (AMD64)] na systéme win32
Ďalšie informácie získate zadaním výrazu „help“, „copyright“, „credit“ alebo „license“.
>>> import bs4
>>> importovať lxml
>>>
Predtým, ako budete pokračovať, mali by ste vytvoriť súbor XML z útržku kódu nižšie. Je to celkom jednoduché a malo by to vyhovovať prípadom použitia, o ktorých sa dozviete vo zvyšku článku. Jednoducho skopírujte, vložte do svojho editora a uložte; meno ako vzorka.xml by malo stačiť.
Strom
Po tretie
Jeden
Dva
Teraz vo vašom skripte Python; budete si musieť prečítať súbor XML ako normálny súbor a potom ho odovzdať do programu BeautifulSoup. Vo zvyšku tohto článku sa použije text bs_content premenná, takže je dôležité, aby ste urobili tento krok.
# Importovať BeautifulSoupz bs4 importujte BeautifulSoup ako bs
obsah = []
# Prečítajte si súbor XML
s otvoreným ("vzorka.xml "," r ") ako súbor:
# Prečítajte si každý riadok v súbore, readlines () vráti zoznam riadkov
obsah = súbor.readlines ()
# Spojte riadky v zozname do reťazca
content = "".pripojiť sa (obsah)
bs_content = bs (obsah, "lxml")
Vzorka kódu vyššie sa importuje Krásna polievka, potom načíta súbor XML ako bežný súbor. Potom odovzdá obsah do importovaného Krásna polievka knižnica, ako aj analyzátor podľa výberu.
Všimnite si, že sa kód neimportuje lxml. Nemusí to tak byť Krásna polievka vyberie lxml analyzátor v dôsledku prechodu „Lxml“ do objektu.
Teraz môžete pokračovať zvyškom článku.
Hľadanie značiek
Jednou z najdôležitejších fáz syntaktickej analýzy súborov XML je hľadanie značiek. Pri použití aplikácie BeautifulSoup to môžete urobiť rôznymi spôsobmi; takže o niektorých z nich musíte vedieť, aby ste mali najlepšie nástroje na vhodnú situáciu.
Značky v dokumentoch XML nájdete takto:
- Mená
- Vzťahy
Hľadanie značiek podľa mien
Pri hľadaní značiek podľa mien môžete použiť dve metódy BeautifulSoup. Prípady použitia sa však líšia; poďme sa na ne pozrieť.
Nájsť
Z vlastnej skúsenosti budete používať Nájsť metóda na vyhľadanie značiek v tomto článku častejšie ako iné metódy. Značka hľadania dostane názov značky, ktorú chcete získať, a vráti objekt značky BeautifulSoup, ak ju nájde; inak sa to vráti Žiadne.
Tu je príklad:
>>> výsledok = bs_content.nájsť („údaje“)>>> tlač (výsledok)
Jeden
>>> výsledok = bs_content.nájsť („jedinečné“)
>>> tlač (výsledok)
>>> výsledok = bs_content.nájsť („otec“)
>>> tlač (výsledok)
Žiadne
>>> výsledok = bs_content.nájsť („matka“)
>>> tlač (výsledok)
Žiadne
Ak sa pozriete na príklad, uvidíte, že Nájsť metóda vráti značku, ak sa zhoduje s menom, inak vráti hodnotu None. Ak sa na ňu však pozriete bližšie, uvidíte, že vráti iba jednu značku.
Napríklad kedy nájsť („údaje“) bol volaný, vrátil iba prvú dátovú značku, ale nevrátil ďalšie.
MÁM ŤA: The Nájsť metóda vráti iba prvú značku, ktorá sa zhoduje s jej dotazom.
Ako teda môžete nájsť ďalšie značky?? To nás vedie k ďalšej metóde.
nájsť_všetko
The nájsť_všetko metóda je dosť podobná Nájsť metóda. Rozdiel je iba v tom, že vráti zoznam značiek, ktoré sa zhodujú s jeho dotazom. Ak nenájde žiadnu značku, vráti prázdny zoznam. Preto, nájsť_všetko vždy vráti zoznam.
Tu je príklad:
>>> výsledok = bs_content.find_all ("data")>>> tlač (výsledok)
[Jeden, Dva]
>>> výsledok = bs_content.find_all ("dieťa")
>>> tlač (výsledok)
[
Po tretie
Jeden
Dva
>>> výsledok = bs_content.find_all ("otec")
>>> tlač (výsledok
[]
>>> výsledok = bs_content.find_all ("matka")
>>> tlač (výsledok)
[]
Teraz, keď viete, ako používať Nájsť a nájsť_všetko metódami, môžete vyhľadávať značky kdekoľvek v dokumente XML. Môžete však zvýšiť výkonnosť svojich vyhľadávaní.
Tu je postup:
Niektoré značky môžu mať rovnaký názov, ale odlišné atribúty. Napríklad dieťa značky majú a názov atribút a rôzne hodnoty. Na základe nich môžete vykonať konkrétne vyhľadávanie.
Pozrite sa na toto:
>>> výsledok = bs_content.find ("child", "name": "Rose")>>> tlač (výsledok)
>>> výsledok = bs_content.find_all ("child", "name": "Rose")
>>> tlač (výsledok)
[
>>> výsledok = bs_content.find ("child", "name": "Jack")
>>> tlač (výsledok)
>>> výsledok = bs_content.find_all ("child", "name": "Jack")
>>> tlač (výsledok)
[
Uvidíte, že v používaní produktu je niečo iné Nájsť a nájsť_všetko metódy tu: obe majú druhý parameter.
Keď zadáte do slovníka ako druhý parameter, znak Nájsť a nájsť_všetko metódy ďalej hľadajú, aby získali značky, ktoré majú atribúty a hodnoty zodpovedajúce zadanému páru kľúč: hodnota.
Napríklad napriek použitiu Nájsť metóda v prvom príklade vrátila druhú dieťa značka (namiesto prvej dieťa značka), pretože to je prvá značka, ktorá sa zhoduje s dotazom. The nájsť_všetko Značka sa riadi rovnakým princípom, až na to, že vráti všetky značky, ktoré sa zhodujú s dotazom, nielen prvý.
Hľadanie značiek podľa vzťahov
Aj keď sú menej populárne ako vyhľadávanie podľa názvov značiek, môžete ich vyhľadávať aj podľa vzťahov. V skutočnom zmysle však ide skôr o navigáciu ako o vyhľadávanie.
V dokumentoch XML existujú tri kľúčové vzťahy:
- Rodič: Značka, v ktorej existuje referenčná značka.
- Deti: Značky, ktoré existujú v referenčnej značke.
- Súrodenci: Značky, ktoré existujú na rovnakej úrovni ako referenčná značka.
Z vyššie uvedeného vysvetlenia vyvodíte, že referenčná značka je najdôležitejším faktorom pri hľadaní značiek podľa vzťahov. Preto hľadajme referenčnú značku a pokračujme v článku.
Pozri sa na toto:
>>> third_child = bs_content.find ("child", "name": "Blue Ivy")>>> tlač (tretie_dieťa)
Po tretie
Jeden
Dva
Z vyššie uvedenej ukážky kódu bude referenčná značka pre zvyšok tejto časti tretia dieťa značka, uložená v a tretie_dieťa premenná. V podsekciách nižšie uvidíte, ako vyhľadávať značky na základe vzťahu ich rodičov, súrodencov a detí s referenčnou značkou.
Hľadanie rodičov
Na vyhľadanie nadradenej značky referenčnej značky použijete rodič atribút. Týmto spôsobom sa vráti nadradená značka, ako aj značky pod ňou. Toto správanie je celkom pochopiteľné, pretože podradené značky sú súčasťou nadradenej značky.
Tu je príklad:
>>> výsledok = tretie_dieťa.rodič>>> tlač (výsledok)
Po tretie
Jeden
Dva
Hľadanie detí
Ak chcete nájsť podradené značky referenčnej značky, využijete deti atribút. Týmto spôsobom sa vrátia podradené značky a podpríznaky pod každou z nich. Toto správanie je tiež pochopiteľné, pretože podradené štítky majú často tiež svoje vlastné podradené štítky.
Jedna vec, ktorú by ste mali poznamenať, je, že deti atribút vráti podradené značky ako generátor. Takže ak potrebujete zoznam podradených značiek, budete musieť previesť generátor na zoznam.
Tu je príklad:
>>> výsledok = zoznam (tretie_dieťa.deti)>>> tlač (výsledok)
['\ n Tretí \ n',
Jeden
Dva
Ak sa bližšie pozriete na vyššie uvedený príklad, všimnete si, že niektoré hodnoty v zozname nie sú značkami. Na to si treba dať pozor.
MÁM ŤA: The deti atribút nevracia iba podradené značky, ale vracia aj text v referenčnej značke.
Nájdenie súrodencov
Posledná v tejto časti je nájdenie značiek, ktoré sú súrodencami referenčnej značky. Pre každú referenčnú značku môžu byť pred ňou a za ňou súrodenecké značky. The predchadzajuci_rodenci atribút vráti súrodenecké značky pred referenčnou značkou a dalsi_rodenci atribút po ňom vráti súrodenecké značky.
Rovnako ako deti atribút, predchadzajuci_rodenci a dalsi_rodenci atribúty vrátia generátory. Ak teda potrebujete zoznam súrodencov, musíte ich previesť na zoznam.
Pozri sa na toto:
>>> previous_siblings = zoznam (tretie_dieťa.previous_sourcing)>>> tlač (previous_sourcing)
['\ n',
>>> next_siblings = zoznam (tretie_dieťa.next_siblings)
>>> tlač (ďalší_súrodenci)
['\ n',
>>> tlač (predošlí_súrodenci + ďalší_súrodenci)
['\ n',
'\ n', '\ n',
Prvý príklad zobrazuje predchádzajúcich súrodencov, druhý zobrazuje ďalších súrodencov; potom sa oba výsledky skombinujú a vygeneruje sa zoznam všetkých súrodencov pre referenčnú značku.
Extrahovanie zo značiek
Pri analýze dokumentov XML spočíva veľa práce v hľadaní správnych značiek. Keď ich však nájdete, možno budete chcieť z týchto značiek extrahovať určité informácie, a to vás naučí táto časť.
Uvidíte, ako extrahovať nasledujúce položky:
- Hodnoty atribútov značiek
- Označiť text
- Označiť obsah
Extrahovanie hodnôt atribútov značiek
Niekedy môžete mať dôvod extrahovať hodnoty atribútov v značke. Napríklad v nasledujúcom párovaní atribút-hodnota: meno = ”ruža”, možno budete chcieť extrahovať „Rose.“
Ak to chcete urobiť, môžete využiť dostať metódou alebo prístupom k názvu atribútu pomocou [] ako index, rovnako ako pri práci so slovníkom.
Tu je príklad:
>>> výsledok = tretie_dieťa.get ("meno")>>> tlač (výsledok)
Modrý brečtan
>>> result = third_child ["meno"]
>>> tlač (výsledok)
Modrý brečtan
Extrahuje sa text značky
Ak chcete získať prístup k textovým hodnotám značky, môžete použiť ikonu text alebo struny atribút. Obe vrátia text v značke a dokonca aj podradené značky. Avšak text atribút ich vráti ako jediný reťazec, zreťazený; kým struny atribút ich vráti ako generátor, ktorý môžete previesť na zoznam.
Tu je príklad:
>>> výsledok = tretie_dieťa.text>>> tlač (výsledok)
'\ n Tretí \ n \ nJeden \ nDva \ nTwins \ n \ n'
>>> výsledok = zoznam (tretie_dieťa.struny)
>>> tlač (výsledok)
['\ n Tretí \ n', '\ n', 'Jeden', '\ n', 'Dva', '\ n', 'Dvojčatá', '\ n', '\ n']
Extrahuje sa obsah značky
Okrem extrahovania hodnôt atribútov a textu značky môžete tiež extrahovať všetok obsah značiek. Môžete to urobiť pomocou obsah atribút; je to trochu podobné deti atribút a prinesie rovnaké výsledky. Zatiaľ čo však deti atribút vráti generátor, obsah atribút vráti zoznam.
Tu je príklad:
>>> výsledok = tretie_dieťa.obsah>>> tlač (výsledok)
['\ n Tretí \ n',
Jeden
Dva
Tlač krásna
Doteraz ste videli niekoľko dôležitých metód a atribútov, ktoré sú užitočné pri analýze dokumentov XML pomocou programu BeautifulSoup. Ak si však všimnete, že pri tlači štítkov na obrazovku majú nejaký zoskupený vzhľad. Aj keď vzhľad nemusí mať priamy vplyv na vašu produktivitu, môže vám pomôcť efektívnejšie analyzovať a zjednodušiť prácu.
Tu je príklad tlače normálnym spôsobom:
>>> tlač (tretie_dieťa)Po tretie
Jeden
Dva
Jeho vzhľad však môžete vylepšiť pomocou predstierať metóda. Stačí zavolať na predstierať metódu na štítku počas tlače a získate niečo vizuálne príjemné.
Pozri sa na toto:
Záver
Analýza dokumentov je dôležitým aspektom získavania údajov. Dokumenty XML sú veľmi populárne a dúfajme, že budete mať lepšie predpoklady na to, aby ste ich prevzali a extrahovali požadované údaje.
Z tohto článku teraz môžete:
- hľadajte značky buď podľa mien, alebo podľa vzťahov
- extrahovať údaje zo značiek
Ak sa cítite dosť stratení a ste v knižnici BeautifulSoup celkom noví, môžete si pozrieť príručku BeautifulSoup pre začiatočníkov.