BeautifulSoup

Kako razčleniti datoteke XML s pomočjo Pythonove BeautifulSoup

Kako razčleniti datoteke XML s pomočjo Pythonove BeautifulSoup
Podatki so dobesedno povsod, v vseh vrstah dokumentov. Ni pa vse koristno, zato ga je treba razčleniti, da dobimo potrebne dele. Dokumenti XML so eden takih dokumentov, ki vsebujejo podatke. So zelo podobne datotekam HTML, saj imajo skoraj enako strukturo. Zato jih boste morali razčleniti, da boste dobili vitalne informacije, tako kot bi to storili pri delu z HTML-jem.

Razčlenjevanje datotek XML ima dva glavna vidika. To so:

Poiskati boste morali oznako, ki vsebuje želene informacije, nato pa te informacije izvleči. Pred koncem tega članka boste izvedeli, kako to storiti pri delu z datotekami XML.

Namestitev

BeautifulSoup je ena najpogosteje uporabljenih knjižnic, ko gre za strganje po spletu s Pythonom. Ker so datoteke XML podobne datotekam HTML, jih lahko tudi razčleni. Za razčlenitev datotek XML s pomočjo BeautifulSoup je najbolje, da uporabite Pythonove datoteke lxml razčlenjevalnik.

Obe knjižnici lahko namestite z uporabo pip namestitveno orodje s pomočjo spodnjega ukaza:

pip namestite bs4 lxml

Če želite potrditi, da sta obe knjižnici uspešno nameščeni, lahko aktivirate interaktivno lupino in poskusite uvoziti obe. Če se ne prikaže nobena napaka, ste pripravljeni na nadaljevanje članka.

Tu je primer:

$ python
Python 3.7.4 (oznake / v3.7.4: e09359112e, 8. julij 2019, 20:34:20)
[MSC v.1916 64-bitni (AMD64)] na win32
Za več informacij vnesite "pomoč", "avtorske pravice", "dobropisi" ali "licenca".
>>> uvozi bs4
>>> uvozi lxml
>>>

Preden nadaljujete, ustvarite datoteko XML iz spodnjega delčka kode. Preprosto je in ustreza primerom uporabe, o katerih boste izvedeli v nadaljevanju članka. Preprosto kopirajte, prilepite v urejevalnik in shranite; ime kot vzorec.xml bi moralo zadostovati.



Drevo

Najprej
Drugič

Tretjič

Ena
Dva
Dvojčka


Četrtič

Zdaj v vašem skriptu Python; datoteko XML boste morali prebrati kot običajno datoteko in jo nato prenesti v BeautifulSoup. Preostanek tega članka bo uporabil bs_content spremenljivka, zato je pomembno, da naredite ta korak.

# Uvozi BeautifulSoup
iz bs4 uvozi BeautifulSoup kot bs
vsebina = []
# Preberite datoteko XML
z odprtim ("vzorec.xml "," r ") kot datoteka:
# Preberite vsako vrstico v datoteki, readlines () vrne seznam vrstic
vsebina = datoteka.bralne vrstice ()
# Vrstice na seznamu združite v niz
vsebina = "".pridruži se (vsebina)
bs_content = bs (vsebina, "lxml")

Vzorec kode nad uvozom BeautifulSoup, nato prebere datoteko XML kot navadno datoteko. Nato vsebino prenese v uvoženo BeautifulSoup knjižnico, kot tudi razčlenjevalnik po izbiri.

Opazili boste, da se koda ne uvozi lxml. Ni treba, da BeautifulSoup bo izbral lxml razčlenjevalnik kot rezultat podajanja “Lxml” v predmet.

Zdaj lahko nadaljujete s preostalim delom članka.

Iskanje oznak

Ena najpomembnejših faz razčlenjevanja datotek XML je iskanje oznak. Pri uporabi BeautifulSoup se lahko tega lotite na različne načine; zato morate vedeti za peščico, da boste imeli najboljša orodja za primerno situacijo.

Oznake v dokumentih XML lahko najdete tako:

Iskanje oznak po imenih

Obstajata dve metodi BeautifulSoup, ki ju lahko uporabite pri iskanju oznak po imenih. Vendar se primeri uporabe razlikujejo; poglejmo jih.

najti

Iz osebnih izkušenj boste uporabili najti metode pogosteje kot druge metode za iskanje oznak v tem članku. Oznaka za iskanje prejme ime oznake, ki jo želite dobiti, in vrne predmet BeautifulSoup oznake, če jo najde; drugače se vrne Nobenega.

Tu je primer:

>>> rezultat = bs_content.najdi ("podatki")
>>> natisni (rezultat)
Ena
>>> rezultat = bs_content.najdi ("edinstveno")
>>> natisni (rezultat)
Dvojčka
>>> rezultat = bs_content.najdi ("oče")
>>> natisni (rezultat)
Nobenega
>>> rezultat = bs_content.najdi ("mati")
>>> natisni (rezultat)
Nobenega

Če si ogledate primer, boste videli, da je najti metoda vrne oznako, če se ujema z imenom, sicer vrne None. Če pa si ga podrobneje ogledate, boste videli, da vrne samo eno oznako.

Na primer, kdaj najdi ("podatki") je bil poklican, vrnil je samo prvo podatkovno oznako, drugih pa ni.

GOTCHA: The najti vrne samo prvo oznako, ki se ujema z njeno poizvedbo.

Torej, kako najti tudi druge oznake? To nas pripelje do naslednje metode.

find_all

The find_all metoda je precej podobna najti metoda. Edina razlika je v tem, da vrne seznam oznak, ki se ujemajo z njegovo poizvedbo. Ko ne najde nobene oznake, preprosto vrne prazen seznam. Zato, find_all bo vedno vrnil seznam.

Tu je primer:

>>> rezultat = bs_content.find_all ("podatki")
>>> natisni (rezultat)
[Ena, Dva]
>>> rezultat = bs_content.find_all ("otrok")
>>> natisni (rezultat)
[Najprej, Drugič,
Tretjič

Ena
Dva
Dvojčka

, Četrtič]
>>> rezultat = bs_content.find_all ("oče")
>>> natisni (rezultat
[]
>>> rezultat = bs_content.find_all ("mati")
>>> natisni (rezultat)
[]

Zdaj, ko veste, kako uporabljati najti in find_all metode, lahko oznake iščete kjer koli v dokumentu XML. Vendar pa lahko svoja iskanja izboljšate.

Takole:

Nekatere oznake imajo lahko isto ime, vendar različne atribute. Na primer otrok oznake imajo ime atribut in različne vrednosti. Na podlagi teh lahko opravite posebna iskanja.

Oglejte si to:

>>> rezultat = bs_content.najdi ("otrok", "ime": "Rose")
>>> natisni (rezultat)
Drugič
>>> rezultat = bs_content.find_all ("otrok", "name": "Rose")
>>> natisni (rezultat)
[Drugič]
>>> rezultat = bs_content.najdi ("otrok", "ime": "Jack")
>>> natisni (rezultat)
Najprej
>>> rezultat = bs_content.find_all ("otrok", "name": "Jack")
>>> natisni (rezultat)
[Najprej]

Videli boste, da je pri uporabi datoteke najti in find_all metode tukaj: oba imata drugi parameter.

Ko predate slovar kot drugi parameter, se najti in find_all metode nadalje iščejo, da dobijo oznake z atributi in vrednostmi, ki ustrezajo podanemu paru ključ: vrednost.

Na primer, kljub uporabi najti metoda v prvem primeru je vrnila drugega otrok tag (namesto prve otrok tag), ker je to prva oznaka, ki se ujema s poizvedbo. The find_all tag sledi istemu principu, le da vrne vse oznake, ki se ujemajo s poizvedbo, ne samo prvo.

Iskanje oznak po odnosih

Čeprav je manj priljubljeno kot iskanje po imenih oznak, ga lahko iščete tudi po odnosih. V resničnem smislu pa gre bolj za navigacijo kot za iskanje.

V dokumentih XML obstajajo trije ključni odnosi:

Iz zgornje razlage lahko sklepate, da je referenčna oznaka najpomembnejši dejavnik pri iskanju oznak po odnosih. Zato poiščimo referenčno oznako in nadaljujmo članek.

Oglejte si to:

>>> tretji_ otrok = bs_content.najdi ("otrok", "ime": "Modri ​​bršljan")
>>> tiskanje (third_child)

Tretjič

Ena
Dva
Dvojčka

Iz zgornjega vzorca kode bo referenčna oznaka za preostanek tega odseka tretja otrok oznaka, shranjena v tretje_dete spremenljivka. V spodnjih pododdelkih boste videli, kako iskati oznake glede na odnos staršev, bratov in otrok z referenčno oznako.

Iskanje staršev

Če želite najti nadrejeno oznako referenčne oznake, boste uporabili starš atribut. S tem vrnete nadrejeno oznako in oznake pod njo. To vedenje je povsem razumljivo, saj so otroške oznake del nadrejene oznake.

Tu je primer:

>>> rezultat = tretje_dete.starš
>>> natisni (rezultat)

Najprej
Drugič

Tretjič

Ena
Dva
Dvojčka


Četrtič

Iskanje otrok

Za iskanje podrejenih oznak referenčne oznake boste uporabili otroci atribut. S tem vrnete podrejene oznake in podtege pod vsako od njih. Tudi to vedenje je razumljivo, saj imajo otroške oznake pogosto tudi svoje otroške oznake.

Ena stvar, ki jo morate upoštevati, je, da otroci atribut vrne podrejene oznake kot generator. Torej, če potrebujete seznam podrejenih oznak, boste morali generator pretvoriti v seznam.

Tu je primer:

>>> rezultat = seznam (third_child.otroci)
>>> natisni (rezultat)
['\ n Tretji \ n',
Ena
Dva
Dvojčka
, '\ n']

Če si podrobneje ogledate zgornji primer, boste opazili, da nekatere vrednosti na seznamu niso oznake. Na to morate paziti.

GOTCHA: The otroci atribut ne vrne samo podrejenih oznak, temveč tudi besedilo v referenčni oznaki.

Iskanje bratov in sester

Zadnje v tem razdelku je iskanje oznak, ki so sorodnice referenčni oznaki. Za vsako referenčno oznako so lahko pred in za njo oznake sorojevalcev. The prejšnji_brate in sestre atribut bo vrnil sorodne oznake pred referenčno oznako in next_siblings atribut bo po njem vrnil sorodniške oznake.

Tako kot otroci atribut, prejšnji_brate in sestre in next_siblings atributi bodo vrnili generatorje. Torej se morate pretvoriti na seznam, če potrebujete seznam bratov in sester.

Oglejte si to:

>>> previous_siblings = seznam (third_child.prejšnje_brate in sestre)
>>> tiskanje (prejšnje_brate in sestre)
['\ n', Drugič, '\ n',
Najprej, '\ n']
>>> next_siblings = seznam (third_child.next_siblings)
>>> natisni (naslednji_brate in sestre)
['\ n', Četrtič]
>>> tiskanje (prejšnji_brate + naslednje_sestre)
['\ n', Drugič, '\ n', Najprej,
'\ n', '\ n', Četrtič, '\ n']

Prvi primer prikazuje prejšnje brate in sestre, drugi prikazuje naslednje brate in sestre; nato se oba rezultata združita, da se ustvari seznam vseh bratov in sester za referenčno oznako.

Izvleček iz oznak

Pri razčlenjevanju dokumentov XML je veliko dela v iskanju pravih oznak. Ko pa jih najdete, boste morda želeli iz teh oznak izvleči tudi določene informacije in tega vas bo naučil ta razdelek.

Videli boste, kako izvleči naslednje:

Izvlečenje vrednosti atributov oznake

Včasih imate morda razlog, da izvlečete vrednosti za atribute v oznaki. Na primer v naslednjem seznanjanju atribut-vrednost: name = "Rose", boste morda želeli izvleči »Rose."

Če želite to narediti, lahko uporabite dobili ali dostop do imena atributa z uporabo [] kot indeks, tako kot pri delu s slovarjem.

Tu je primer:

>>> rezultat = tretje_dete.get ("ime")
>>> natisni (rezultat)
Modri ​​bršljan
>>> rezultat = tretje_dete ["ime"]
>>> natisni (rezultat)
Modri ​​bršljan

Izvlečenje besedila oznake

Ko želite dostopati do besedilnih vrednosti oznake, lahko uporabite besedilo ali strune atribut. Oba bosta vrnila besedilo v oznaki in celo podrejene oznake. Vendar besedilo atribut jih bo vrnil kot en sam niz, združen; medtem ko strune atribut jih bo vrnil kot generator, ki ga lahko pretvorite na seznam.

Tu je primer:

>>> rezultat = tretje_dete.besedilo
>>> natisni (rezultat)
'\ n Tretji \ n \ nEden \ nDve \ nDvojci \ n \ n'
>>> rezultat = seznam (third_child.strune)
>>> natisni (rezultat)
['\ n Tretji \ n', '\ n', 'Eden', '\ n', 'Dva', '\ n', 'Dvojčka', '\ n', '\ n']

Izdvajanje vsebine oznake

Poleg pridobivanja vrednosti atributov in besedila oznake lahko izvlečete tudi vso vsebino oznak. Če želite to narediti, lahko uporabite vsebino atribut; je nekoliko podoben otroci atribut in bo prinesel enake rezultate. Vendar, medtem ko otroci atribut vrne generator, vsebino atribut vrne seznam.

Tu je primer:

>>> rezultat = tretje_dete.vsebino
>>> natisni (rezultat)
['\ n Tretji \ n',
Ena
Dva
Dvojčka
, '\ n']

Lepo tiskanje

Do zdaj ste videli nekaj pomembnih metod in atributov, ki so uporabni pri razčlenjevanju dokumentov XML s pomočjo BeautifulSoup. Če pa opazite, imajo oznake, ko natisnete na zaslon, nekakšen gručast videz. Čeprav videz morda nima neposrednega vpliva na vašo produktivnost, vam lahko pomaga učinkoviteje razčleniti in zmanjšati delo.

Tu je primer običajnega tiskanja:

>>> tiskanje (third_child)

Tretjič

Ena
Dva
Dvojčka

Videz pa lahko izboljšate z uporabo polepšati metoda. Preprosto pokličite polepšati na oznako med tiskanjem in dobili boste nekaj vizualno prijetnega.

Oglejte si to:

Zaključek

Razčlenjevanje dokumentov je pomemben vidik pridobivanja podatkov. Dokumenti XML so zelo priljubljeni in upamo, da ste bolje opremljeni za njihovo pridobivanje in pridobivanje želenih podatkov.

Iz tega članka lahko zdaj:

Če se počutite precej izgubljeno in ste v knjižnici BeautifulSoup precej novi, si lahko ogledate vadnico BeautifulSoup za začetnike.

Kako prenesti in igrati Sid Meier's Civilization VI v Linuxu
Uvod v igro Civilization 6 je sodoben pogled na klasični koncept, uveden v seriji iger Age of Empires. Ideja je bila dokaj preprosta; začeli bi v zelo...
Kako namestiti in igrati Doom v Linuxu
Uvod v Doom Serija Doom je nastala v devetdesetih letih po izidu prvotnega Dooma. Bil je takojšen hit in od takrat naprej je serija iger prejela števi...
Vulkan za uporabnike Linuxa
Z vsako novo generacijo grafičnih kart vidimo, da razvijalci iger premikajo meje grafične zvestobe in se približujejo fotorealizmu. A kljub vsem kredi...