XML failu parsēšanai ir divi galvenie aspekti. Viņi ir:
- Tagu atrašana
- Izvilkšana no tagiem
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 lxmlLai 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:
$ pitonsPython 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
Trešais
Viens
Divi
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 zupuno 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:
- Vārdi
- Attiecības
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)
>>> 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)
[
Trešais
Viens
Divi
>>> 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)
>>> rezultāts = bs_content.find_all ("bērns", "vārds": "Roze")
>>> izdrukāt (rezultāts)
[
>>> rezultāts = bs_content.atrast ("bērns", "vārds": "Džeks")
>>> izdrukāt (rezultāts)
>>> rezultāts = bs_content.find_all ("bērns", "vārds": "Džeks")
>>> izdrukāt (rezultāts)
[
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:
- Vecāks: Tags, kurā pastāv atsauces tags.
- Bērni: Tagi, kas pastāv atsauces tagā.
- Brāļi un māsas: Tagi, kas pastāv vienā līmenī ar atsauces tagu.
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
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)
Trešais
Viens
Divi
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
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',
>>> next_siblings = saraksts (trešais_bērns.next_siblings)
>>> drukāt (nākamie_mācības)
['\ n',
>>> drukāt (iepriekšējie_mācības + nākamie_mācījumi)
['\ n',
'\ n', '\ 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ības
- Taga teksts
- Taga saturs
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
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
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:
- meklējiet tagus pēc nosaukumiem vai attiecībām
- iegūt datus no tagiem
Ja jūtaties diezgan apmaldījies un esat diezgan jauns bibliotēkā BeautifulSoup, varat apskatīt iesācēju programmu BeautifulSoup.