Skaista zupa

Parsēt XML failus, izmantojot Python's BeautifulSoup

Parsēt XML failus, izmantojot Python's BeautifulSoup
Dati ir burtiski visur, visu veidu dokumentos. Bet ne viss no tā ir noderīgs, tāpēc ir nepieciešams to parsēt, lai iegūtu vajadzīgās detaļas. XML dokumenti ir viens no šādiem dokumentiem, kurā glabājas dati. Tie ir ļoti līdzīgi HTML failiem, jo ​​tiem ir gandrīz tāda paša veida struktūra. Tādējādi, lai iegūtu svarīgu informāciju, jums tās būs jāizanalizē tāpat kā jūs, strādājot ar HTML.

XML failu parsēšanai ir divi galvenie aspekti. Viņi ir:

Jums būs jāatrod tags, kurā glabāta vajadzīgā informācija, un pēc tam šī informācija jāizvelk. Pirms šī raksta beigām uzzināsiet, kā rīkoties abos, strādājot ar XML failiem.

Uzstādīšana

BeautifulSoup ir viena no visbiežāk izmantotajām bibliotēkām, kad runa ir par tīmekļa nokasīšanu ar Python. Tā kā XML faili ir līdzīgi HTML failiem, tas tos var arī parsēt. Lai parsētu XML failus, izmantojot BeautifulSoup, vislabāk ir izmantot Python lxml parsētājs.

Abas bibliotēkas var instalēt, izmantojot pip instalēšanas rīku, izmantojot zemāk esošo komandu:

pip instalēt bs4 lxml

Lai apstiprinātu, ka abas bibliotēkas ir veiksmīgi instalētas, varat aktivizēt interaktīvo čaulu un mēģināt importēt abas. Ja netiek parādīta neviena kļūda, jūs esat gatavs turpināt darbu ar pārējo rakstu.

Lūk, piemērs:

$ pitons
Python 3.7.4 (tagi / v3.7.4: e09359112e, 2019. gada 8. jūlijs, 20:34:20)
[MSC v.1916. gada 64 bitu (AMD64)] uz Win32
Lai iegūtu papildinformāciju, ierakstiet “help”, “copyright”, “credits” vai “licence”.
>>> importēt bs4
>>> importēt lxml
>>>

Pirms doties tālāk, jums jāizveido XML fails no zemāk esošā koda fragmenta. Tas ir diezgan vienkārši, un tam jāatbilst lietošanas gadījumiem, par kuriem uzzināsiet pārējā rakstā. Vienkārši nokopējiet, ielīmējiet redaktorā un saglabājiet; tāds vārds kā paraugs.xml vajadzētu pietikt.



Koks

Pirmkārt
Otrkārt

Trešais

Viens
Divi
Dvīņi


Ceturtkārt

Tagad jūsu Python skriptā; jums būs jālasa XML fails kā parasts fails, pēc tam jāpārsūta tas uz BeautifulSoup. Šī raksta atlikušajā daļā tiks izmantots bs_content mainīgais, tāpēc ir svarīgi veikt šo darbību.

# Importēt skaistu zupu
no bs4 importēt BeautifulSoup kā bs
saturs = []
# Izlasiet XML failu
ar atvērtu ("paraugs.xml "," r ") kā fails:
# Izlasiet katru faila rindiņu, readlines () atgriež rindu sarakstu
saturs = fails.lasāmrindas ()
# Apvienojiet saraksta rindas virknē
saturs = "".pievienoties (saturs)
bs_content = bs (saturs, "lxml")

Kodu paraugs virs importēšanas Skaista zupa, tad tas nolasa XML failu kā parastu failu. Pēc tam tas nodod saturu importētajam Skaista zupa bibliotēka, kā arī izvēlētais parsētājs.

Jūs ievērosiet, ka kods netiek importēts lxml. Tā tam nav jābūt Skaista zupa izvēlēsies lxml parsētājs pārejas rezultātā “Lxml” objektā.

Tagad jūs varat turpināt pārējo rakstu.

Tagu atrašana

Viens no vissvarīgākajiem XML failu parsēšanas posmiem ir tagu meklēšana. Lietojot BeautifulSoup, ir dažādi veidi, kā to izdarīt; tāpēc jums jāzina par nedaudziem no viņiem, lai jums būtu vislabākie rīki atbilstošajai situācijai.

XML dokumentos tagus varat atrast:

Tagu atrašana pēc nosaukumiem

Ir divas BeautifulSoup metodes, kuras varat izmantot, atrodot tagus pēc nosaukumiem. Tomēr lietošanas gadījumi atšķiras; apskatīsim viņus.

atrast

Pēc personīgās pieredzes jūs izmantosiet atrast metodi biežāk nekā citas metodes, kā atrast rakstus šajā rakstā. Atrodošais tags saņem tā taga nosaukumu, kuru vēlaties iegūt, un atgriež taga objektu BeautifulSoup, ja tāds tiek atrasts; citādi tas atgriežas Nav.

Lūk, piemērs:

>>> rezultāts = bs_content.atrast ("dati")
>>> izdrukāt (rezultāts)
Viens
>>> rezultāts = bs_content.atrast ("unikāls")
>>> izdrukāt (rezultāts)
Dvīņi
>>> rezultāts = bs_content.atrast ("tēvs")
>>> izdrukāt (rezultāts)
Nav
>>> rezultāts = bs_content.atrast ("māte")
>>> izdrukāt (rezultāts)
Nav

Aplūkojot piemēru, redzēsit, ka atrast method atgriež tagu, ja tas atbilst nosaukumam, pretējā gadījumā atgriež None. Tomēr, ja to tuvāk apskatīsit, redzēsit, ka tas atgriež tikai vienu tagu.

Piemēram, kad atrast (“dati”) tika izsaukts, tas atgrieza tikai pirmo datu tagu, bet citus neatdeva.

GOTCHA: The atrast metode atgriezīs tikai pirmo tagu, kas atbilst tā vaicājumam.

Tātad, kā atrast arī citus tagus? Tas mūs noved pie nākamās metodes.

atrast_viss

The atrast_viss metode ir diezgan līdzīga atrast metodi. Vienīgā atšķirība ir tā, ka tas atgriež tagu sarakstu, kas atbilst tā vaicājumam. Ja tas neatrod nevienu tagu, tas vienkārši atgriež tukšu sarakstu. Tādējādi, atrast_viss vienmēr atgriezīs sarakstu.

Lūk, piemērs:

>>> rezultāts = bs_content.find_all ("dati")
>>> izdrukāt (rezultāts)
[Viens, Divi]
>>> rezultāts = bs_content.find_all ("bērns")
>>> izdrukāt (rezultāts)
[Pirmkārt, Otrkārt,
Trešais

Viens
Divi
Dvīņi

, Ceturtkārt]
>>> rezultāts = bs_content.find_all ("tēvs")
>>> druka (rezultāts
[]
>>> rezultāts = bs_content.find_all ("māte")
>>> izdrukāt (rezultāts)
[]

Tagad, kad jūs zināt, kā izmantot atrast un atrast_viss metodes, tagus varat meklēt jebkur XML dokumentā. Tomēr jūs varat padarīt meklējumus jaudīgākus.

Lūk, kā:

Dažiem tagiem var būt tāds pats nosaukums, bet dažādi atribūti. Piemēram, bērns tagiem ir a nosaukums atribūtu un dažādas vērtības. Pamatojoties uz tiem, varat veikt īpašus meklējumus.

Apskatiet šo:

>>> rezultāts = bs_content.atrast ("bērns", "vārds": "Roze")
>>> izdrukāt (rezultāts)
Otrkārt
>>> rezultāts = bs_content.find_all ("bērns", "vārds": "Roze")
>>> izdrukāt (rezultāts)
[Otrkārt]
>>> rezultāts = bs_content.atrast ("bērns", "vārds": "Džeks")
>>> izdrukāt (rezultāts)
Pirmkārt
>>> rezultāts = bs_content.find_all ("bērns", "vārds": "Džeks")
>>> izdrukāt (rezultāts)
[Pirmkārt]

Jūs redzēsiet, ka ir kaut kas atšķirīgs atrast un atrast_viss metodes šeit: tām abām ir otrais parametrs.

Ievadot vārdnīcu kā otro parametru, atrast un atrast_viss metodes turpina meklēt, lai iegūtu tagus, kuriem ir atribūti un vērtības, kas atbilst paredzētajam atslēgas: vērtību pārim.

Piemēram, neskatoties uz atrast Pirmajā piemērā tā atgrieza otro bērns tagu (nevis pirmo bērns tag), jo tas ir pirmais tags, kas atbilst vaicājumam. The atrast_viss tag ievēro to pašu principu, izņemot to, ka tas atgriež visus tagus, kas atbilst vaicājumam, ne tikai pirmo.

Tagu atrašana pēc attiecībām

Lai gan tas ir mazāk populārs nekā meklēšana pēc tagu nosaukumiem, jūs varat meklēt tagus arī pēc attiecībām. Patiesībā tas tomēr ir vairāk orientēšanās nekā meklēšana.

XML dokumentos ir trīs galvenās attiecības:

No iepriekš sniegtā skaidrojuma jūs varat secināt, ka atsauces tags ir vissvarīgākais faktors, meklējot tagus pēc attiecībām. Tāpēc meklēsim atsauces tagu un turpināsim rakstu.

Apskatiet šo:

>>> trešais_bērns = bs_saturs.atrast ("bērns", "vārds": "Zilā efeja")
>>> druka (trešais_bērns)

Trešais

Viens
Divi
Dvīņi

No iepriekš minētā koda parauga atsauces tags pārējai šai sadaļai būs trešais bērns tag, kas saglabāts a trešais_bērns mainīgais. Zemāk esošajās apakšsadaļās redzēsit, kā meklēt tagus, pamatojoties uz viņu vecāku, brāļu un māsu un bērnu attiecībām ar atsauces tagu.

Vecāku atrašana

Lai atrastu atsauces taga vecāku tagu, izmantojiet vecāks atribūts. To darot, tiek atgriezts vecāku tags, kā arī tagi zem tā. Šī rīcība ir diezgan saprotama, jo bērnu tagi ir daļa no vecāku taga.

Lūk, piemērs:

>>> rezultāts = trešais_bērns.vecāks
>>> izdrukāt (rezultāts)

Pirmkārt
Otrkārt

Trešais

Viens
Divi
Dvīņi


Ceturtkārt

Bērnu atrašana

Lai atrastu atsauces taga bērnu tagus, izmantojiet bērni atribūts. To darot, tiek atgriezti bērnu tagi, kā arī apakš-tagi zem katra no tiem. Šī uzvedība ir arī saprotama, jo arī bērnu tagiem bieži ir savi bērnu tagi.

Jāatzīmē viena lieta, ka bērni atribūts atgriež bērnu tagus kā ģeneratoru. Tātad, ja jums ir nepieciešams bērnu tagu saraksts, ģenerators jāpārvērš sarakstā.

Lūk, piemērs:

>>> rezultāts = saraksts (trešais_bērns.bērni)
>>> izdrukāt (rezultāts)
['\ n Trešais \ n',
Viens
Divi
Dvīņi
, '\ n']

Ja rūpīgāk apskatīsit iepriekš minēto piemēru, pamanīsit, ka dažas saraksta vērtības nav tagi. Tas ir kaut kas, kas jums jāuzmanās.

GOTCHA: The bērni atribūts neatgriež tikai bērnu tagus, bet arī tekstu atsauces tagā.

Brāļu un māsu atrašana

Pēdējais šajā sadaļā ir tādu tagu atrašana, kas ir atsauces taga brāļi un māsas. Katram atsauces tagam pirms un pēc tā var būt brāļu tagi. The iepriekšējie_mācības atribūts atgriezīs brāļa / māsas tagus pirms atsauces taga un next_siblings atribūts pēc tā atgriezīs brāļu tagus.

Tāpat kā bērni atribūts iepriekšējie_mācības un next_siblings atribūti atgriezīs ģeneratorus. Tātad, ja nepieciešams brāļu un māsu saraksts, jums ir jāpārvērš saraksts.

Apskatiet šo:

>>> previous_siblings = saraksts (trešais_bērns.iepriekšējie_mācības)
>>> drukāt (iepriekšējie_mācības)
['\ n', Otrkārt, '\ n',
Pirmkārt, '\ n']
>>> next_siblings = saraksts (trešais_bērns.next_siblings)
>>> drukāt (nākamie_mācības)
['\ n', Ceturtkārt]
>>> drukāt (iepriekšējie_mācības + nākamie_mācījumi)
['\ n', Otrkārt, '\ n', Pirmkārt,
'\ n', '\ n', Ceturtkārt, '\ n']

Pirmajā piemērā parādīti iepriekšējie brāļi un māsas, otrajā - nākamie brāļi un māsas; tad abi rezultāti tiek apvienoti, lai izveidotu visu brāļu un māsu sarakstu atsauces tagam.

Izvilkšana no tagiem

Parsējot XML dokumentus, liels darbs ir saistīts ar pareizo tagu atrašanu. Tomēr, atrodot tos, iespējams, vēlēsities arī iegūt noteiktu informāciju no šiem tagiem, un tieši to jums iemācīs šī sadaļa.

Jūs redzēsiet, kā iegūt:

Tagu atribūtu vērtību iegūšana

Dažreiz jums var būt iemesls tagā atribūtu vērtību izvilkšanai. Šādā atribūtu un vērtību savienošanā, piemēram: name = ”Roze”, jūs varētu vēlēties izvilkt “Roze.”

Lai to izdarītu, varat izmantot gūt metodi vai piekļūt atribūta nosaukumam, izmantojot [] kā indekss, tāpat kā jūs, strādājot ar vārdnīcu.

Lūk, piemērs:

>>> rezultāts = trešais_bērns.iegūt ("nosaukums")
>>> izdrukāt (rezultāts)
Zilā Ivy
>>> rezultāts = trešais_bērns ["vārds"]
>>> izdrukāt (rezultāts)
Zilā efeja

Iegūstot taga tekstu

Ja vēlaties piekļūt taga teksta vērtībām, varat izmantot tekstu vai stīgas atribūts. Abi atgriezīs tekstu tagā un pat bērni tagus. Tomēr tekstu atribūts tos atgriezīs kā vienu virkni, savienotu; kamēr stīgas atribūts tos atgriezīs kā ģeneratoru, kuru var pārveidot par sarakstu.

Lūk, piemērs:

>>> rezultāts = trešais_bērns.tekstu
>>> izdrukāt (rezultāts)
'\ n Trešais \ n \ nViens \ nDivi \ nTwins \ n \ n'
>>> rezultāts = saraksts (trešais_bērns.stīgas)
>>> izdrukāt (rezultāts)
['\ n Trešais \ n', '\ n', 'Viens', '\ n', 'Divi', '\ n', 'Dvīņi', '\ n', '\ n']

Tagu satura izvilkšana

Papildus atribūtu vērtību un taga teksta iegūšanai varat arī iegūt visu tagu saturu. Lai to izdarītu, varat izmantot saturu atribūts; tas ir mazliet līdzīgs bērni atribūtu un sniegs tādus pašus rezultātus. Tomēr, lai gan bērni atribūts atgriež ģeneratoru saturu atribūts atgriež sarakstu.

Lūk, piemērs:

>>> rezultāts = trešais_bērns.saturu
>>> izdrukāt (rezultāts)
['\ n Trešais \ n',
Viens
Divi
Dvīņi
, '\ n']

Drukāšana skaista

Līdz šim esat redzējis dažas svarīgas metodes un atribūtus, kas ir noderīgi, analizējot XML dokumentus, izmantojot BeautifulSoup. Bet, ja pamanāt, drukājot tagus ekrānā, tiem ir sava veida kopa. Lai arī izskats var tieši neietekmēt jūsu produktivitāti, tas var palīdzēt efektīvāk parsēt un padarīt darbu mazāk garlaicīgu.

Šis ir parastā drukāšanas piemērs:

>>> druka (trešais_bērns)

Trešais

Viens
Divi
Dvīņi

Tomēr jūs varat uzlabot tā izskatu, izmantojot precizēt metodi. Vienkārši zvaniet precizēt metodi tagā drukāšanas laikā, un jūs iegūsit kaut ko vizuāli patīkamu.

Apskatiet šo:

Secinājums

Dokumentu parsēšana ir svarīgs datu iegūšanas aspekts. XML dokumenti ir diezgan populāri, un, cerams, ka jums ir labākas iespējas tos uzņemt un iegūt vajadzīgos datus.

No šī raksta jūs tagad varat:

Ja jūtaties diezgan apmaldījies un esat diezgan jauns bibliotēkā BeautifulSoup, varat apskatīt iesācēju programmu BeautifulSoup.

5 labākie ergonomiskie datoru peles izstrādājumi Linux
Vai ilgstoša datora lietošana izraisa sāpes plaukstas locītavā vai pirkstos? Vai jūs ciešat no stīvām locītavām un jums pastāvīgi ir jāspiež rokas? Va...
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...
Izmantojot X-Mouse Button Control, atšķirīgi mainiet peles pogas atšķirīgai programmatūrai
Varbūt jums ir nepieciešams rīks, kas varētu mainīt peles vadību ar katru lietoto lietojumprogrammu. Ja tas tā ir, varat izmēģināt lietojumprogrammu a...