Hvordan analysere XML -filer ved hjelp av Pythons Beautifules

Hvordan analysere XML -filer ved hjelp av Pythons Beautifules

Data er bokstavelig talt overalt, i alle slags dokumenter. Men ikke alt er nyttig, derav behovet for å analysere det for å få de delene som trengs. XML -dokumenter er et av slike dokumenter som har data. De ligner veldig på HTML -filer, ettersom de har nesten samme type struktur. Derfor må du analysere dem for å få viktig informasjon, akkurat som du ville gjort når du jobber med HTML.Det er to hovedaspekter ved å analysere XML -filer. De er:

  • Finne tagger
  • Trekke ut fra tagger

Du må finne taggen som inneholder informasjonen du ønsker, og deretter trekke ut den informasjonen. Du lærer hvordan du gjør begge deler når du jobber med XML -filer før slutten av denne artikkelen.

Installasjon

BeautifulSoup er et av de mest brukte bibliotekene når det gjelder skraping av nettet med Python. Siden XML -filer ligner HTML -filer, er de også i stand til å analysere dem. For å analysere XML -filer ved hjelp av Beautifulesuppe, er det best at du bruker Pythons LXML analyser.

Du kan installere begge bibliotekene ved hjelp av Pip Installasjonsverktøy, gjennom kommandoen nedenfor:

Pip installer BS4 LXML

For å bekrefte at begge bibliotekene er installert, kan du aktivere det interaktive skallet og prøve å importere begge deler. Hvis ingen feil dukker opp, er du klar til å gå med resten av artikkelen.

Her er et eksempel:

$ python
Python 3.7.4 (tagger/v3.7.4: E09359112E, 8. juli 2019, 20:34:20)
[MSC v.1916 64 bit (AMD64)] på Win32
Skriv "Hjelp", "Copyright", "Credits" eller "License" for mer informasjon.
>>> Importer BS4
>>> Importer LXML
>>>

Før du går videre, bør du opprette en XML -fil fra kodebiten nedenfor. Det er ganske enkelt, og skal passe til brukssakene du lærer om i resten av artikkelen. Bare kopier, lim inn redaktøren din og lagre; et navn som prøve.XML skal være nok.



Treet

Først
Sekund

Tredje

En
To
tvillinger


Fjerde

Nå, i Python -skriptet ditt; Du må lese XML -filen som en vanlig fil, og deretter gi den til BeautifulSoup. Resten av denne artikkelen vil benytte seg av bs_content variabel, så det er viktig at du tar dette trinnet.

# Importer BeautifulSoup
Fra BS4 importerer BeautifulSoup som BS
innhold = []
# Les XML -filen
med åpen ("prøve.xml "," r ") som fil:
# Les hver linje i filen, ReadLines () returnerer en liste over linjer
Innhold = fil.ReadLines ()
# Kombiner linjene i listen til en streng
innhold = "".Bli med (innhold)
bs_content = bs (innhold, "lxml")

Kodeprøven over import BeautifulSoup, Så leser den XML -filen som en vanlig fil. Etter det gir det innholdet inn i det importerte BeautifulSoup Bibliotek så vel som den valgte parseren.

Du vil merke at koden ikke importerer LXML. Det trenger ikke å være som BeautifulSoup vil velge LXML analyser som et resultat av bestått “LXML” inn i objektet.

Nå kan du fortsette med resten av artikkelen.

Finne tagger

Et av de viktigste stadiene med analysering av XML -filer er å søke etter tagger. Det er forskjellige måter å gjøre dette på når du bruker Beautifulesuppe; Så du må vite om en håndfull av dem for å ha de beste verktøyene for den aktuelle situasjonen.

Du kan finne koder i XML -dokumenter av:

  • Navn
  • Forhold

Finne tagger etter navn

Det er to Beautiful -metoder du kan bruke når du finner koder etter navn. Brukssakene er imidlertid forskjellige; La oss se på dem.

finne

Fra personlig erfaring vil du bruke finne metode oftere enn de andre metodene for å finne tagger i denne artikkelen. Finn -taggen mottar navnet på taggen du vil få, og returnerer et Beautiful -objekt på taggen hvis den finner en; ellers kommer det tilbake Ingen.

Her er et eksempel:

>>> resultat = bs_content.Finn ("Data")
>>> utskrift (resultat)
En
>>> resultat = bs_content.finn ("unik")
>>> utskrift (resultat)
tvillinger
>>> resultat = bs_content.Finn ("Far")
>>> utskrift (resultat)
Ingen
>>> resultat = bs_content.Finn ("Mor")
>>> utskrift (resultat)
Ingen

Hvis du tar en titt på eksemplet, vil du se at finne metoden returnerer en tag hvis den samsvarer med navnet, ellers returnerer den ingen. Imidlertid, hvis du ser nærmere på det, vil du se at den bare returnerer en enkelt tagg.

For eksempel når Finn (“Data”) ble kalt, den returnerte bare den første datagoden, men returnerte ikke de andre.

TOK DEG: De finne Metoden vil bare returnere den første taggen som samsvarer med spørringen.

Så hvordan får du også finne andre tagger? Det fører oss til neste metode.

find_all

De find_all metoden er ganske lik finne metode. Den eneste forskjellen er at den returnerer en liste over tagger som samsvarer med spørringen. Når den ikke finner noen tag, returnerer den ganske enkelt en tom liste. Derfor, find_all vil alltid returnere en liste.

Her er et eksempel:

>>> resultat = bs_content.find_all ("data")
>>> utskrift (resultat)
[En, To]
>>> resultat = bs_content.find_all ("barn")
>>> utskrift (resultat)
[Først, Sekund,
Tredje

En
To
tvillinger

,
Fjerde]
>>> resultat = bs_content.find_all ("Far")
>>> utskrift (resultat
[]
>>> resultat = bs_content.find_all ("mor")
>>> utskrift (resultat)
[]

Nå som du vet hvordan du bruker finne og find_all Metoder, kan du søke etter tagger hvor som helst i XML -dokumentet. Imidlertid kan du gjøre søkene dine kraftigere.

Dette er hvordan:

Noen tagger kan ha samme navn, men forskjellige attributter. For eksempel barn Tagger har en Navn attributt og forskjellige verdier. Du kan gjøre spesifikke søk basert på dem.

Ta en titt på dette:

>>> resultat = bs_content.finn ("barn", "navn": "rose")
>>> utskrift (resultat)
Sekund
>>> resultat = bs_content.find_all ("barn", "navn": "rose")
>>> utskrift (resultat)
[Sekund]
>>> resultat = bs_content.finn ("barn", "navn": "jack")
>>> utskrift (resultat)
Først
>>> resultat = bs_content.find_all ("barn", "navn": "jack")
>>> utskrift (resultat)
[Først]

Du vil se at det er noe annerledes med bruken av finne og find_all Metoder her: De har begge en andre parameter.

Når du passerer i en ordbok som en andre parameter, er det finne og find_all Metoder videre søket for å få tagger som har attributter og verdier som passer til den medfølgende tasten: verdipar.

For eksempel, til tross for at jeg brukte finne metode I det første eksemplet returnerte den det andre barn Tag (i stedet for den første barn tag), fordi det er den første taggen som samsvarer med spørringen. De find_all Tag følger det samme prinsippet, bortsett fra at den returnerer alle taggene som samsvarer med spørringen, ikke bare den første.

Finne tagger etter forhold

Selv om du er mindre populær enn å søke etter tagnavn, kan du også søke etter tagger etter forhold. I den virkelige forstand er det mer å navigere enn å søke.

Det er tre viktige forhold i XML -dokumenter:

  • Foreldre: Taggen der referansekoden eksisterer i.
  • Barn: Taggene som finnes i referanselappen.
  • Søsken: Taggene som eksisterer på samme nivå som referanselappen.

Fra forklaringen ovenfor kan du utlede at referansekoden er den viktigste faktoren i å søke etter tagger etter forhold. La oss derfor se etter referansekoden, og fortsette artikkelen.

Se på dette:

>>> tredje_child = bs_content.Finn ("Barn", "Navn": "Blue Ivy")
>>> Print (Third_child)

Tredje

En
To
tvillinger

Fra kodeprøven ovenfor vil referansekoden for resten av denne delen være den tredje barn tag, lagret i en tredje_barn variabel. I underavsnitt nedenfor vil du se hvordan du søker etter tagger basert på foreldrene, søsken og barn forholdet til referansekoden.

Finne foreldre

For å finne overordnede taggen til en referanselapp, vil du bruke foreldre Egenskap. Å gjøre dette returnerer overordnede taggen, så vel som taggene under den. Denne oppførselen er ganske forståelig, siden barna tagger er en del av overordnede taggen.

Her er et eksempel:

>>> resultat = tredje_barn.foreldre
>>> utskrift (resultat)

Først
Sekund

Tredje

En
To
tvillinger


Fjerde

Finne barn

For å finne barna -tagene til en referansemerke, vil du benytte deg av barn Egenskap. Å gjøre dette returnerer barna tagger, så vel som underkoblingene under hver og en av dem. Denne oppførselen er også forståelig, ettersom barna tagger ofte har sine egne barns tagger også.

En ting du bør merke deg er at barn Attributt returnerer barna tagger som generator. Så hvis du trenger en liste over barna -tagene, må du konvertere generatoren til en liste.

Her er et eksempel:

>>> Resultat = liste (Third_child.barn)
>>> utskrift (resultat)
['\ n tredje \ n',
En
To
tvillinger
, '\ n']

Hvis du ser nærmere på eksemplet over, vil du merke at noen verdier i listen ikke er tagger. Det er noe du trenger å passe på.

TOK DEG: De barn Attributt returnerer ikke bare barna tagger, den returnerer også teksten i referansekoden.

Finne søsken

Det siste i denne delen er å finne tagger som er søsken til referansekoden. For hver referansemerke kan det være søskenkoder før og etter det. De Forrige_sibling attributt vil returnere søskenkodene før referansekoden, og NESTE_SIBLINGS attributt vil returnere søskenkodene etter det.

Akkurat som barn attributt, Forrige_sibling og NESTE_SIBLINGS Attributter vil returnere generatorer. Så du må konvertere til en liste hvis du trenger en liste over søsken.

Se på dette:

>>> forrige_siblings = liste (Third_child.forrige_sibling)
>>> trykk (forrige_siblings)
['\ n', Sekund, '\ n',
Først, '\ n']
>>> next_siblings = list (tredje_child.next_siblings)
>>> trykk (Next_siblings)
['\ n', Fjerde]
>>> skriv ut (forrige_sibling + next_siblings)
['\ n', Sekund, '\ n', Først,
'\ n', '\ n', Fjerde, '\ n']

Det første eksemplet viser de tidligere søsknene, det andre viser de neste søsknene; Deretter kombineres begge resultatene for å generere en liste over alle søsknene for referansekoden.

Trekke ut fra tagger

Når du analyserer XML -dokumenter, ligger mye av arbeidet i å finne de riktige taggene. Når du finner dem, kan det være lurt å hente ut viss informasjon fra disse taggene, og det er det denne delen vil lære deg.

Du vil se hvordan du henter ut følgende:

  • Tag -attributtverdier
  • Tag -tekst
  • Taginnhold

Trekke ut tag -attributtverdier

Noen ganger kan du ha en grunn til å trekke ut verdiene for attributter i en tag. I følgende attributtverdi-parring for eksempel: Navn = ”Rose”, Det kan være lurt å trekke ut “Rose.”

For å gjøre dette, kan du benytte deg av metode, eller få tilgang til attributtets navn ved hjelp av [] Som en indeks, akkurat som du ville gjort når du jobber med en ordbok.

Her er et eksempel:

>>> resultat = tredje_barn.få ("navn")
>>> utskrift (resultat)
Blå eføy
>>> resultat = tredje_child ["Navn"]
>>> utskrift (resultat)
Blå eføy

ETTER TAG TEXT

Når du vil få tilgang til tekstverdiene til en tag, kan du bruke tekst eller strenger Egenskap. Begge vil returnere teksten i en tag, og til og med barna tagger. Imidlertid tekst Attributt vil returnere dem som en enkelt streng, sammenkoblet; mens strenger Attributt vil returnere dem som en generator som du kan konvertere til en liste.

Her er et eksempel:

>>> resultat = tredje_barn.tekst
>>> utskrift (resultat)
'\ n tredje \ n \ ingen \ ntwo \ ntwins \ n \ n'
>>> Resultat = liste (Third_child.strenger)
>>> utskrift (resultat)
['\ n tredje \ n', '\ n', 'en', '\ n', 'to', '\ n', 'Twins', '\ n', '\ n']

Trekke ut taginnhold

Bortsett fra å trekke ut attributtverdiene, og taggetekst, kan du også trekke ut alt et tags -innhold. For å gjøre dette, kan du bruke innhold Egenskap; det ligner litt på barn attributt og vil gi de samme resultatene. Imidlertid, mens barn attributt returnerer en generator, innhold Attributt returnerer en liste.

Her er et eksempel:

>>> resultat = tredje_barn.innhold
>>> utskrift (resultat)
['\ n tredje \ n',
En
To
tvillinger
, '\ n']

Skrive ut vakker

Så langt har du sett noen viktige metoder og attributter som er nyttige når du analyserer XML -dokumenter ved hjelp av BeautifulSoup. Men hvis du merker, når du skriver ut taggene til skjermen, har de en slags gruppert utseende. Selv om utseende kanskje ikke har noen direkte innvirkning på produktiviteten din, kan det hjelpe deg å analysere mer effektivt og gjøre arbeidet mindre kjedelig.

Her er et eksempel på å skrive ut den normale måten:

>>> Print (Third_child)

Tredje

En
To
tvillinger

Du kan imidlertid forbedre utseendet ved å bruke Prettify metode. Bare ring Prettify metode på taggen mens du skriver ut, og du får noe visuelt behagelig.

Se på dette:

Konklusjon

Parsingdokumenter er et viktig aspekt ved innkjøp for data. XML -dokumenter er ganske populære, og forhåpentligvis er du bedre rustet til å ta dem på og trekke ut dataene du ønsker.

Fra denne artikkelen kan du nå:

  • Søk etter tagger enten etter navn, eller forhold
  • Pakk ut data fra tagger

Hvis du føler deg ganske tapt, og er ganske ny på BeautifulSoup -biblioteket, kan du sjekke ut BeautySoup Tutorial for nybegynnere.