BeautifulSoup

Kako raščlaniti XML datoteke pomoću Pythonovog BeautifulSoupa

Kako raščlaniti XML datoteke pomoću Pythonovog BeautifulSoupa
Podaci su doslovno svugdje, u svim vrstama dokumenata. Ali nije sve korisno, pa je stoga potrebno raščlaniti kako bi se dobili potrebni dijelovi. XML dokumenti jedan su od takvih dokumenata koji sadrže podatke. Oni su vrlo slični HTML datotekama, jer imaju gotovo istu strukturu. Stoga ćete ih morati raščlaniti kako biste dobili vitalne informacije, baš kao što biste to učinili i prilikom rada s HTML-om.

Postoje dva glavna aspekta raščlanjivanja XML datoteka. Oni su:

Morat ćete pronaći oznaku koja sadrži informacije koje želite, a zatim ih izdvojiti. Prije kraja ovog članka naučit ćete kako raditi oboje pri radu s XML datotekama.

Montaža

BeautifulSoup jedna je od najčešće korištenih knjižnica kada je riječ o struganju weba s Pythonom. Budući da su XML datoteke slične HTML datotekama, on ih također može raščlaniti. Ipak, za raščlanjivanje XML datoteka pomoću BeautifulSoupa, najbolje je da koristite Pythonove datoteke lxml parser.

Obje biblioteke možete instalirati pomoću pip alat za instalaciju, putem naredbe u nastavku:

pip instalirati bs4 lxml

Da biste potvrdili da su obje knjižnice uspješno instalirane, možete aktivirati interaktivnu ljusku i pokušati uvesti obje. Ako se ne pojavi pogreška, spremni ste za nastavak članka.

Evo primjera:

$ python
Python 3.7.4 (oznake / v3.7.4: e09359112e, 8. srpnja 2019., 20:34:20)
[MSC v.1916 64-bitni (AMD64)] na win32
Upišite "pomoć", "autorska prava", "krediti" ili "licenca" za više informacija.
>>> uvoz bs4
>>> uvoz lxml
>>>

Prije nastavka, trebali biste stvoriti XML datoteku iz isječka koda u nastavku. Prilično je jednostavno i trebalo bi odgovarati slučajevima korištenja o kojima ćete saznati u ostatku članka. Jednostavno kopirajte, zalijepite u svoj editor i spremite; ime poput uzorak.xml treba biti dovoljan.



Stablo

Prvi
Drugi

Treći

Jedan
Dva
Blizanci


Četvrta

Sada, u vašoj Python skripti; morat ćete pročitati XML datoteku kao normalnu datoteku, a zatim je proslijediti u BeautifulSoup. U ostatku ovog članka koristit će se bs_content varijabla, pa je važno da poduzmete ovaj korak.

# Uvezi BeautifulSoup
iz bs4 uvozi BeautifulSoup kao bs
sadržaj = []
# Pročitajte XML datoteku
s otvorenim ("uzorak.xml "," r ") kao datoteka:
# Pročitajte svaki redak u datoteci, readlines () vraća popis redaka
sadržaj = datoteka.redovi za čitanje ()
# Kombinirajte retke na popisu u niz
sadržaj = "".pridruži se (sadržaj)
bs_content = bs (sadržaj, "lxml")

Uzorak koda iznad uvoza BeautifulSoup, tada čita XML datoteku poput obične datoteke. Nakon toga prosljeđuje sadržaj u uvezeni BeautifulSoup knjižnica kao i parser po izboru.

Primijetit ćete da se kôd ne uvozi lxml. Ne mora kao BeautifulSoup će odabrati lxml parser kao rezultat dodavanja "Lxml" u objekt.

Sada možete nastaviti s ostatkom članka.

Pronalaženje oznaka

Jedna od najvažnijih faza raščlanjivanja XML datoteka je traženje oznaka. Postoje različiti načini da se to postigne kada se koristi BeautifulSoup; pa morate znati za nekolicinu njih kako biste imali najbolje alate za odgovarajuću situaciju.

Oznake u XML dokumentima možete pronaći na sljedeći način:

Traženje oznaka po imenima

Postoje dvije metode BeautifulSoup koje možete koristiti prilikom pronalaženja oznaka prema imenima. Međutim, slučajevi upotrebe razlikuju se; pogledajmo ih.

pronaći

Iz osobnog iskustva koristit ćete pronaći metoda češće od ostalih metoda za pronalaženje oznaka u ovom članku. Oznaka za pronalaženje prima ime oznake koju želite dobiti i vraća BeautifulSoup objekt oznake ako je pronađe; inače, vraća se Nijedna.

Evo primjera:

>>> rezultat = bs_content.pronađi ("podaci")
>>> ispis (rezultat)
Jedan
>>> rezultat = bs_content.pronađi ("jedinstveno")
>>> ispis (rezultat)
Blizanci
>>> rezultat = bs_content.pronađi ("otac")
>>> ispis (rezultat)
Nijedna
>>> rezultat = bs_content.pronađi ("majka")
>>> ispis (rezultat)
Nijedna

Ako pogledate primjer, vidjet ćete da pronaći metoda vraća oznaku ako se podudara s imenom, u suprotnom vraća None. Međutim, ako ga pažljivije pogledate, vidjet ćete da vraća samo jednu oznaku.

Na primjer, kada pronađi ("podaci") je pozvan, vratio je samo prvu podatkovnu oznaku, ali nije vratio ostale.

IMAM TE: The pronaći metoda će vratiti samo prvu oznaku koja odgovara njenom upitu.

Pa kako doći i do drugih oznaka? To nas vodi do sljedeće metode.

naći_sve

The naći_sve metoda prilično je slična pronaći metoda. Jedina je razlika što vraća popis oznaka koje odgovaraju njegovom upitu. Kad ne pronađe nijednu oznaku, jednostavno vraća prazan popis. Stoga, naći_sve uvijek će vratiti popis.

Evo primjera:

>>> rezultat = bs_content.find_all ("podaci")
>>> ispis (rezultat)
[Jedan, Dva]
>>> rezultat = bs_content.find_all ("dijete")
>>> ispis (rezultat)
[Prvi, Drugi,
Treći

Jedan
Dva
Blizanci

, Četvrta]
>>> rezultat = bs_content.find_all ("otac")
>>> ispis (rezultat
[]
>>> rezultat = bs_content.find_all ("majka")
>>> ispis (rezultat)
[]

Sada kada znate kako koristiti pronaći i naći_sve metode, možete pretraživati ​​oznake bilo gdje u XML dokumentu. Međutim, možete svoja pretraživanja učiniti moćnijima.

Evo kako:

Neke oznake mogu imati isto ime, ali različite atribute. Na primjer, dijete oznake imaju a Ime atribut i različite vrijednosti. Na temelju njih možete izvršiti određena pretraživanja.

Pogledajte ovo:

>>> rezultat = bs_content.pronađi ("dijete", "ime": "Ruža")
>>> ispis (rezultat)
Drugi
>>> rezultat = bs_content.find_all ("dijete", "name": "Rose")
>>> ispis (rezultat)
[Drugi]
>>> rezultat = bs_content.pronađi ("dijete", "ime": "Jack")
>>> ispis (rezultat)
Prvi
>>> rezultat = bs_content.find_all ("dijete", "name": "Jack")
>>> ispis (rezultat)
[Prvi]

Vidjet ćete da postoji nešto drugačije u korištenju pronaći i naći_sve metode ovdje: obje imaju drugi parametar.

Kada predate rječnik kao drugi parametar, pronaći i naći_sve metode dalje pretražuju kako bi dobili oznake koje imaju atribute i vrijednosti koji odgovaraju navedenom paru ključ: vrijednost.

Na primjer, unatoč tome što koristite pronaći metoda u prvom primjeru, vratila je drugi dijete oznaka (umjesto prve dijete tag), jer je to prva oznaka koja odgovara upitu. The naći_sve Oznaka slijedi isti princip, osim što vraća sve oznake koje odgovaraju upitu, ne samo prvu.

Traženje oznaka prema vezama

Iako je manje popularno od pretraživanja po imenima oznaka, oznake možete pretraživati ​​i prema odnosima. U stvarnom smislu to je više navigacija nego traženje.

Tri su ključna odnosa u XML dokumentima:

Iz gornjeg objašnjenja možete zaključiti da je referentna oznaka najvažniji čimbenik u pretraživanju oznaka prema vezama. Stoga, potražimo referentnu oznaku i nastavimo članak.

Pogledaj ovo:

>>> treće_dijete = bs_content.pronađi ("dijete", "ime": "Plavi bršljan")
>>> ispis (third_child)

Treći

Jedan
Dva
Blizanci

Iz gornjeg uzorka koda, referentna oznaka za ostatak ovog odjeljka bit će treća dijete oznaka, pohranjena u a treće_dijete varijabilna. U donjem odjeljku vidjet ćete kako pretraživati ​​oznake na temelju odnosa roditelja, braće i djece s referentnom oznakom.

Pronalaženje roditelja

Da biste pronašli nadređenu oznaku referentne oznake, poslužit ćete se oznakom roditelj atribut. To vraća matičnu oznaku, kao i oznake ispod nje. Ovo je ponašanje sasvim razumljivo, jer su dječje oznake dio roditeljske oznake.

Evo primjera:

>>> rezultat = treće_ dijete.roditelj
>>> ispis (rezultat)

Prvi
Drugi

Treći

Jedan
Dva
Blizanci


Četvrta

Pronalaženje djece

Da biste pronašli podređene oznake referentne oznake, upotrijebit ćete djeco atribut. To vraća dječje oznake, kao i podoznake ispod svake od njih. Ovo je ponašanje također razumljivo, jer oznake za djecu često imaju i svoje oznake za djecu.

Jedna stvar koju biste trebali primijetiti je da djeco atribut vraća dječje oznake kao generator. Dakle, ako vam treba popis podređenih oznaka, morat ćete pretvoriti generator u popis.

Evo primjera:

>>> rezultat = popis (third_child.djeca)
>>> ispis (rezultat)
['\ n Treće \ n',
Jedan
Dva
Blizanci
, '\ n']

Ako pažljivije pogledate gornji primjer, primijetit ćete da neke vrijednosti na popisu nisu oznake. To je nešto na što morate paziti.

IMAM TE: The djeco atribut ne vraća samo podređene oznake, već vraća i tekst u referentnoj oznaci.

Pronalaženje braće i sestara

Posljednje u ovom odjeljku je pronalaženje oznaka koje su srodne s referentnom oznakom. Za svaku referentnu oznaku mogu postojati oznake srodnika prije i poslije nje. The prethodna_braća i sestre atribut vratit će oznake srodnika prije referentne oznake, a next_siblings atribut vratit će oznake brata ili sestre nakon njega.

Baš kao i djeco atribut, prethodna_braća i sestre i next_siblings atributi će vratiti generatore. Stoga se morate pretvoriti u popis ako trebate popis braće i sestara.

Pogledaj ovo:

>>> previous_siblings = popis (third_child.prethodna_braća i sestre)
>>> ispis (prethodne_sestre)
['\ n', Drugi, '\ n',
Prvi, '\ n']
>>> next_siblings = popis (third_child.sljedeća_braća i sestre)
>>> ispis (next_siblings)
['\ n', Četvrta]
>>> ispis (prethodni_braća i sestre + sljedeći_braća i sestre)
['\ n', Drugi, '\ n', Prvi,
'\ n', '\ n', Četvrta, '\ n']

Prvi primjer prikazuje prethodnu braću i sestre, drugi prikazuje sljedeću braću i sestre; tada se oba rezultata kombiniraju kako bi se generirao popis svih braće i sestara za referentnu oznaku.

Izdvajanje iz oznaka

Kada se raščlanjuju XML dokumenti, puno posla leži u pronalaženju pravih oznaka. Međutim, kada ih pronađete, možda ćete htjeti i izvući određene podatke iz tih oznaka, a tome će vas naučiti ovaj odjeljak.

Vidjet ćete kako izvući sljedeće:

Izdvajanje vrijednosti atributa oznake

Ponekad možda imate razlog za izdvajanje vrijednosti za atribute u oznaci. Na primjer, u sljedećem uparivanju vrijednosti atribut-vrijednost: name = "Ruža", možda biste željeli izvući “Ružu."

Da biste to učinili, možete koristiti dobiti metodu ili pristup imenu atributa pomoću [] poput indeksa, baš kao kad biste radili s rječnikom.

Evo primjera:

>>> rezultat = treće_ dijete.get ("ime")
>>> ispis (rezultat)
Plavi bršljan
>>> rezultat = treće_dijete ["ime"]
>>> ispis (rezultat)
Plavi bršljan

Izdvajanje teksta oznake

Kada želite pristupiti tekstualnim vrijednostima oznake, možete koristiti tekst ili žice atribut. Oboje će vratiti tekst u oznaku, pa čak i podređene oznake. Međutim tekst atribut vratit će ih kao jedan niz, ujedinjeni; dok žice atribut vratit će ih kao generator koji možete pretvoriti u popis.

Evo primjera:

>>> rezultat = treće_ dijete.tekst
>>> ispis (rezultat)
'\ n Treće \ n \ nJedno \ nDvoje \ nBlizanine \ n \ n'
>>> rezultat = popis (third_child.žice)
>>> ispis (rezultat)
['\ n Treće \ n', '\ n', 'Jedna', '\ n', 'Dvije', '\ n', 'Blizanci', '\ n', '\ n']

Izdvajanje sadržaja oznake

Osim izdvajanja vrijednosti atributa i teksta oznake, također možete izdvojiti sav sadržaj oznaka. Da biste to učinili, možete koristiti sadržaj atribut; pomalo je sličan djeco atribut i dat će iste rezultate. Međutim, dok je djeco atribut vraća generator, sadržaj atribut vraća popis.

Evo primjera:

>>> rezultat = treće_ dijete.sadržaj
>>> ispis (rezultat)
['\ n Treće \ n',
Jedan
Dva
Blizanci
, '\ n']

Lijepo ispisivanje

Do sada ste vidjeli neke važne metode i atribute korisne pri raščlanjivanju XML dokumenata pomoću BeautifulSoupa. Ali ako primijetite, kad ispisujete oznake na zaslon, one imaju nekakav skupljeni izgled. Iako izgled možda neće imati izravan utjecaj na vašu produktivnost, može vam pomoći da učinkovitije raščlanite i učinite posao manje zamornim.

Evo primjera ispisa na uobičajeni način:

>>> ispis (third_child)

Treći

Jedan
Dva
Blizanci

Međutim, možete poboljšati njegov izgled pomoću uljepšati metoda. Jednostavno nazovite uljepšati metodom na oznaci tijekom ispisa i dobit ćete nešto vizualno ugodno.

Pogledaj ovo:

Zaključak

Raščlanjivanje dokumenata važan je aspekt nabave podataka. XML dokumenti prilično su popularni i nadamo se da ste bolje opremljeni za njihovo preuzimanje i izdvajanje podataka koje želite.

Iz ovog članka sada možete:

Ako se osjećate prilično izgubljeno i prilično ste novi u knjižnici BeautifulSoup, možete pogledati udžbenik BeautifulSoup za početnike.

Kako koristiti Xdotool za poticanje klikova i pritiska miša u Linuxu
Xdotool je besplatni alat za naredbene retke otvorenog koda za simulaciju klikova mišem i pritiska tipki. Ovaj će članak pokrivati ​​kratki vodič o ko...
Top 5 ergonomskih proizvoda za računalni miš za Linux
Uzrokuje li dugotrajno korištenje računala bolove u zapešću ili prstima? Patite li od ukočenih zglobova i stalno se morate rukovati? Osjećate li goruć...
How to Change Mouse and Touchpad Settings Using Xinput in Linux
Most Linux distributions ship with “libinput” library by default to handle input events on a system. It can process input events on both Wayland and X...