Graži sriuba

Kaip išanalizuoti XML failus naudojant „Python“ „BeautifulSoup“

Kaip išanalizuoti XML failus naudojant „Python“ „BeautifulSoup“
Duomenys yra pažodžiui visur, visuose dokumentuose. Bet ne visa tai yra naudinga, todėl reikia ją išanalizuoti, norint gauti reikalingas dalis. XML dokumentai yra vienas iš tokių dokumentų, kuriuose saugomi duomenys. Jie labai panašūs į HTML failus, nes jų struktūra beveik tokia pati. Taigi, norėdami gauti gyvybiškai svarbią informaciją, turėsite juos analizuoti, kaip ir dirbdami su HTML.

Yra du pagrindiniai XML failų analizavimo aspektai. Jie yra:

Turėsite rasti žymą, kurioje yra norima informacija, tada išskleisti tą informaciją. Sužinokite, kaip tai padaryti, dirbant su XML failais, iki šio straipsnio pabaigos.

Montavimas

„BeautifulSoup“ yra viena iš dažniausiai naudojamų bibliotekų, kai reikia nuskaityti žiniatinklį su „Python“. Kadangi XML failai yra panašūs į HTML failus, jis taip pat gali juos analizuoti. Vis dėlto norint analizuoti XML failus naudojant „BeautifulSoup“, geriausia naudoti „Python“ lxml analizatorius.

Abi bibliotekas galite įdiegti naudodami pip diegimo įrankis, naudodamasis toliau pateikta komanda:

„pip install bs4 lxml“

Norėdami patvirtinti, kad abi bibliotekos sėkmingai įdiegtos, galite suaktyvinti interaktyvųjį apvalkalą ir pabandyti importuoti abi. Jei neatsiranda klaidos, esate pasirengę pereiti prie likusio straipsnio.

Štai pavyzdys:

$ python
„Python 3“.7.4 (žymos / v3.7.4: e09359112e, 2019 m. Liepos 8 d., 20:34:20)
[MSC v.1916 m. 64 bitų (AMD64)] „Win32“
Norėdami gauti daugiau informacijos, įveskite „pagalba“, „autorių teisės“, „kreditai“ arba „licencija“.
>>> importuoti bs4
>>> importuoti lxml
>>>

Prieš eidami toliau, turėtumėte sukurti XML failą iš toliau pateikto kodo fragmento. Tai gana paprasta ir turėtų atitikti naudojimo atvejus, apie kuriuos sužinosite likusioje straipsnio dalyje. Tiesiog nukopijuokite, įklijuokite į redaktorių ir išsaugokite; toks vardas kaip pavyzdys.xml turėtų pakakti.



Medis

Pirmas
Antra

Trečias

Vienas
Du
Dvyniai


Ketvirta

Dabar jūsų „Python“ scenarijuje; turėsite perskaityti XML failą kaip įprastą failą, tada perduoti jį į „BeautifulSoup“. Likusioje šio straipsnio dalyje bus naudojamasi bs_content kintamasis, todėl svarbu atlikti šį žingsnį.

# Importuoti „BeautifulSoup“
iš „bs4“ importuokite „BeautifulSoup“ kaip bs
turinys = []
# Perskaitykite XML failą
su atvira ("pavyzdys.xml "," r ") kaip failas:
# Perskaitykite kiekvieną failo eilutę, readlines () pateikia eilučių sąrašą
turinys = failas.eilutės ()
# Sujunkite sąrašo eilutes į eilutę
turinys = "".prisijungti (turinys)
bs_content = bs (turinys, „lxml“)

Virš importuojamo kodo pavyzdys Graži sriuba, tada jis skaito XML failą kaip įprastą failą. Po to jis perduoda turinį į importuotą Graži sriuba biblioteką, taip pat pasirinktą analizatorių.

Pastebėsite, kad kodas neimportuojamas lxml. Tai neturi būti taip Graži sriuba pasirinks lxml analizatorius kaip rezultatas „Lxml“ į objektą.

Dabar galite tęsti likusį straipsnį.

Žymų paieška

Vienas iš svarbiausių XML failų analizavimo etapų yra žymų paieška. Yra daug būdų, kaip tai padaryti naudojant „BeautifulSoup“; todėl turite žinoti apie nedaugelį jų, kad turėtumėte geriausius įrankius atitinkamai situacijai.

XML dokumentuose žymes galite rasti:

Žymų paieška pagal vardus

Yra du „BeautifulSoup“ metodai, kuriuos galite naudoti ieškodami žymų pagal pavadinimus. Tačiau naudojimo atvejai skiriasi; pažvelkime į juos.

rasti

Remdamiesi asmenine patirtimi, naudosite rasti metodas dažniau nei kiti šio straipsnio žymių paieškos metodai. Radimo žyma gauna norimos gauti žymos pavadinimą ir grąžina žymos objektą „BeautifulSoup“, jei tokį randa; kitu atveju jis grįžta Nė vienas.

Štai pavyzdys:

>>> rezultatas = bs_content.rasti („duomenys“)
>>> spausdinti (rezultatas)
Vienas
>>> rezultatas = bs_content.rasti („unikalus“)
>>> spausdinti (rezultatas)
Dvyniai
>>> rezultatas = bs_content.rasti („tėvas“)
>>> spausdinti (rezultatas)
Nė vienas
>>> rezultatas = bs_content.rasti („motina“)
>>> spausdinti (rezultatas)
Nė vienas

Pažvelgę ​​į pavyzdį pamatysite, kad rasti metodas grąžina žymą, jei ji atitinka pavadinimą, kitaip grąžina Nėra. Tačiau jei atidžiau pažvelgsite, pamatysite, kad ji grąžina tik vieną žymą.

Pavyzdžiui, kada rasti („duomenys“) buvo paskambinta, ji grąžino tik pirmąją duomenų žymą, bet negrąžino kitų.

GOTCHA: The rasti metodas grąžins tik pirmąją žymą, atitinkančią užklausą.

Taigi, kaip rasti ir kitas žymas? Tai veda mus prie kito metodo.

rasti_visi

The rasti_visi metodas yra gana panašus į rasti metodas. Vienintelis skirtumas yra tas, kad jis pateikia žymių, atitinkančių užklausą, sąrašą. Neradęs jokios žymos, jis paprasčiausiai pateikia tuščią sąrašą. Vadinasi, rasti_visi visada grąžins sąrašą.

Štai pavyzdys:

>>> rezultatas = bs_content.find_all ("duomenys")
>>> spausdinti (rezultatas)
[Vienas, Du]
>>> rezultatas = bs_content.find_all ("vaikas")
>>> spausdinti (rezultatas)
[Pirmas, Antra,
Trečias

Vienas
Du
Dvyniai

, Ketvirta]
>>> rezultatas = bs_content.find_all ("tėvas")
>>> spausdinti (rezultatas
[]
>>> rezultatas = bs_content.find_all („motina“)
>>> spausdinti (rezultatas)
[]

Dabar, kai žinote, kaip naudotis rasti ir rasti_viskas metodų, žymių galite ieškoti bet kurioje XML dokumento vietoje. Tačiau galite padaryti savo paieškas galingesnes.

Štai kaip:

Kai kurios žymos gali turėti tą patį pavadinimą, bet skirtingus atributus. Pavyzdžiui, vaikas žymos turi vardas atributas ir skirtingos vertės. Pagal tai galite atlikti konkrečias paieškas.

Pažvelkite į tai:

>>> rezultatas = bs_content.rasti („vaikas“, „vardas“: „Rožė“)
>>> spausdinti (rezultatas)
Antra
>>> rezultatas = bs_content.find_all ("vaikas", "vardas": "Rožė")
>>> spausdinti (rezultatas)
[Antra]
>>> rezultatas = bs_content.rasti („vaikas“, „vardas“: „Džekas“)
>>> spausdinti (rezultatas)
Pirmas
>>> rezultatas = bs_content.find_all ("vaikas", "vardas": "Džekas")
>>> spausdinti (rezultatas)
[Pirmas]

Pamatysite, kad yra kažkas kitokio rasti ir rasti_visi metodai čia: jie abu turi antrą parametrą.

Kai perduodate žodyną kaip antrą parametrą, rasti ir rasti_viskas metodai toliau ieško norėdami gauti žymes, turinčias atributus ir reikšmes, atitinkančias pateiktą raktą: reikšmės pora.

Pavyzdžiui, nepaisant to, kad naudojate rasti metodas, jis grąžino antrąjį vaikas žyma (vietoj pirmosios vaikas žymė), nes tai pirmoji žyma, atitinkanti užklausą. The rasti_viskas žyma vadovaujasi tuo pačiu principu, išskyrus tai, kad ji grąžina visas užklausą atitinkančias žymas, ne tik pirmąją.

Žymų paieška pagal santykius

Nors tai mažiau populiaru nei ieškoti pagal žymų pavadinimus, tačiau jų galite ieškoti ir pagal santykius. Tikrąja prasme tai yra daugiau naršymas nei ieškojimas.

XML dokumentuose yra trys pagrindiniai ryšiai:

Iš aukščiau pateikto paaiškinimo galite daryti išvadą, kad etiketė yra svarbiausias veiksnys ieškant žymių pagal ryšius. Taigi, ieškokime nuorodos žymos ir tęskime straipsnį.

Pažvelkite į tai:

>>> trečiasis vaikas = bs_content.rasti („vaikas“, „vardas“: „Mėlyna Ivy“)
>>> spausdinti (trečias_vaikas)

Trečias

Vienas
Du
Dvyniai

Remiantis aukščiau pateiktu kodo pavyzdžiu, likusio šio skyriaus nuoroda bus trečioji vaikas žyma, saugoma a trečias_vaikas kintamasis. Toliau pateiktuose poskyriuose pamatysite, kaip ieškoti žymų, atsižvelgiant į jų tėvų, brolių ir seserų bei vaikų ryšį su nuorodos žyma.

Tėvų paieška

Norėdami rasti pagrindinės žymos etiketę, naudokitės tėvas atributas. Tai atlikus grąžinama pagrindinė žyma ir po ja esančios žymos. Toks elgesys yra visiškai suprantamas, nes vaikų žymos yra pirminės žymos dalis.

Štai pavyzdys:

>>> rezultatas = trečias_vaikas.tėvas
>>> spausdinti (rezultatas)

Pirmas
Antra

Trečias

Vienas
Du
Dvyniai


Ketvirta

Vaikų radimas

Norėdami rasti etiketės vaikų žymas, naudokitės vaikai atributas. Tai atlikus grąžinamos vaikų žymos, taip pat po kiekviena iš jų esančios antrinės žymos. Toks elgesys taip pat suprantamas, nes vaikai taip pat dažnai turi savo vaikų etiketes.

Reikėtų atkreipti dėmesį į tai, kad vaikai atributas grąžina vaikų žymas kaip generatorių. Taigi, jei jums reikia vaikų žymų sąrašo, turėsite konvertuoti generatorių į sąrašą.

Štai pavyzdys:

>>> rezultatas = sąrašas (trečias_vaikas.vaikai)
>>> spausdinti (rezultatas)
['\ n Trečia \ n',
Vienas
Du
Dvyniai
, „\ n“]

Jei atidžiau pažvelgsite į anksčiau pateiktą pavyzdį, pastebėsite, kad kai kurios sąrašo vertės nėra žymos. To reikia saugotis.

GOTCHA: The vaikai atributas grąžina ne tik vaikų žymas, bet ir nuorodos žymos tekstą.

Surasti brolius ir seseris

Paskutinis šiame skyriuje yra žymių, kurios yra nuorodos žymos broliai ir seserys, radimas. Kiekvienoje nuorodos žymoje prieš ir po jos gali būti brolių brolių žymos. The ankstesni_gimdymai atributas grąžins brolių / seserų žymes prieš nuorodos žymą ir sekantys_gimdymai atributas po jo grąžins brolių žymas.

Visai kaip vaikai atributas, ankstesni_gimdymai ir sekantys_gimdymai atributai grąžins generatorius. Taigi jums reikia konvertuoti į sąrašą, jei jums reikia brolių ir seserų sąrašo.

Pažvelkite į tai:

>>> previous_siblings = list (trečias_vaikas.ankstesni_dalymai)
>>> atspausdinti (ankstesni_skaičiai)
['\ n', Antra, „\ n“,
Pirmas, „\ n“]
>>> next_siblings = list (trečias_vaikas.sekantys_gimdymai)
>>> spausdinti (next_siblings)
['\ n', Ketvirta]
>>> atspausdinti (ankstesni_skaičiuoti + sekantys_prabagai)
['\ n', Antra, „\ n“, Pirmas,
„\ n“, „\ n“, Ketvirta, „\ n“]

Pirmajame pavyzdyje rodomi ankstesni broliai ir seserys, antrame - kiti broliai ir seserys; tada abu rezultatai sujungiami, kad būtų sudarytas visų etaloninės žymos brolių ir seserų sąrašas.

Ištraukimas iš žymių

Analizuojant XML dokumentus, daug darbo tenka ieškant tinkamų žymų. Tačiau radę juos, galbūt norėsite išgauti tam tikrą informaciją iš tų žymų ir to išmokys šis skyrius.

Pamatysite, kaip išgauti:

Žymos atributų verčių išskyrimas

Kartais gali būti priežasties išskirti žymos atributų vertes. Pvz., Atributo ir vertės poravime: vardas = ”Rožė”, galbūt norėsite išgauti „Rožę.“

Norėdami tai padaryti, galite pasinaudoti gauti metodas arba prieiga prie atributo vardo naudojant [] kaip rodyklė, kaip ir dirbant su žodynu.

Štai pavyzdys:

>>> rezultatas = trečias_vaikas.gauti („vardas“)
>>> spausdinti (rezultatas)
Mėlyna Ivy
>>> rezultatas = trečias_vaikas ["vardas"]
>>> spausdinti (rezultatas)
Mėlyna Ivy

Žymos teksto ištraukimas

Kai norite pasiekti žymos teksto vertes, galite naudoti teksto arba stygos atributas. Abu jie grąžins žyma tekstą ir net vaikai. Tačiau teksto atributas grąžins juos kaip vieną eilutę, sujungtą; kol stygos atributas grąžins juos kaip generatorių, kurį galėsite konvertuoti į sąrašą.

Štai pavyzdys:

>>> rezultatas = trečias_vaikas.teksto
>>> spausdinti (rezultatas)
Trečiasis \ n \ nVienas \ nDu \ nTwins \ n \ n '
>>> rezultatas = sąrašas (trečias_vaikas.stygos)
>>> spausdinti (rezultatas)
['\ n Trečiasis \ n', '\ n', 'Vienas', '\ n', 'Du', '\ n', 'Dvyniai', '\ n', '\ n']

Žymų turinio išskleidimas

Be atributų verčių ir žymos teksto išskyrimo, taip pat galite išskleisti visą žymių turinį. Norėdami tai padaryti, galite naudoti turinį atributas; jis yra šiek tiek panašus į vaikai atributą ir duos tuos pačius rezultatus. Tačiau, nors vaikai atributas grąžina generatorių turinį atributas grąžina sąrašą.

Štai pavyzdys:

>>> rezultatas = trečias_vaikas.turinį
>>> spausdinti (rezultatas)
['\ n Trečia \ n',
Vienas
Du
Dvyniai
, „\ n“]

Spauda graži

Iki šiol matėte keletą svarbių metodų ir atributų, kurie yra naudingi analizuojant XML dokumentus naudojant „BeautifulSoup“. Bet jei pastebite, kai spausdindami žymas į ekraną, jos atrodo tarsi sugrupuotos. Nors išvaizda gali neturėti tiesioginės įtakos jūsų produktyvumui, ji gali padėti efektyviau analizuoti ir padaryti darbą mažiau varginančiu.

Štai įprasto spausdinimo pavyzdys:

>>> spausdinti (trečias_vaikas)

Trečias

Vienas
Du
Dvyniai

Tačiau galite pagerinti jo išvaizdą naudodami pagražinti metodas. Tiesiog paskambinkite pagražinti metodas ant etiketės spausdinant, ir jūs gausite ką nors vizualiai malonaus.

Pažvelkite į tai:

Išvada

Dokumentų analizavimas yra svarbus duomenų gavimo aspektas. XML dokumentai yra gana populiarūs, ir tikimės, kad esate geriau pasirengę juos paimti ir išgauti norimus duomenis.

Iš šio straipsnio dabar galite:

Jei jaučiatės gana pasimetęs ir esate gana naujas „BeautifulSoup“ bibliotekoje, galite peržiūrėti „BeautifulSoup“ pamoką pradedantiesiems.

10 geriausių žaidimų, kuriuos reikia žaisti naudojant „Ubuntu“
„Windows“ platforma buvo viena iš dominuojančių žaidimų platformų dėl didžiulio procento žaidimų, kurie šiandien kuriami natūraliai palaikant „Windows...
5 geriausi „Arcade“ žaidimai, skirti „Linux“
Šiais laikais kompiuteriai yra rimta mašina, naudojama žaidimams. Jei negalėsite gauti naujo aukšto rezultato, žinosite, ką noriu pasakyti. Šiame įraš...
Mūšis už Wesnothą 1.13.6 Išleista plėtra
Mūšis už Wesnothą 1.13.6 išleistas praėjusį mėnesį, yra šeštasis 1 versijos kūrimo leidimas.13.„x“ serija ir ji teikia daug patobulinimų, ypač vartoto...