Postoje dva glavna aspekta raščlanjivanja XML datoteka. Oni su:
- Pronalaženje oznaka
- Izdvajanje iz oznaka
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 lxmlDa 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:
$ pythonPython 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
Treći
Jedan
Dva
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 BeautifulSoupiz 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:
- Imena
- Odnosi
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)
>>> 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)
[
Treći
Jedan
Dva
>>> 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)
>>> rezultat = bs_content.find_all ("dijete", "name": "Rose")
>>> ispis (rezultat)
[
>>> rezultat = bs_content.pronađi ("dijete", "ime": "Jack")
>>> ispis (rezultat)
>>> rezultat = bs_content.find_all ("dijete", "name": "Jack")
>>> ispis (rezultat)
[
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:
- Roditelj: Oznaka u kojoj referentna oznaka postoji.
- Djeco: Oznake koje postoje u referentnoj oznaci.
- Braća i sestre: Oznake koje postoje na istoj razini kao i referentna oznaka.
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
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)
Treći
Jedan
Dva
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
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',
>>> next_siblings = popis (third_child.sljedeća_braća i sestre)
>>> ispis (next_siblings)
['\ n',
>>> ispis (prethodni_braća i sestre + sljedeći_braća i sestre)
['\ n',
'\ n', '\ 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:
- Vrijednosti atributa oznake
- Tekst oznake
- Sadržaj oznake
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
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
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:
- tražite oznake po imenima ili vezama
- izvlačenje podataka iz oznaka
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.