Come analizzare i file XML usando la bellasoup di Python

Come analizzare i file XML usando la bellasoup di Python

I dati sono letteralmente ovunque, in tutti i tipi di documenti. Ma non tutto è utile, quindi la necessità di analizzarlo per ottenere le parti necessarie. I documenti XML sono uno di tali documenti che detengono dati. Sono molto simili ai file HTML, in quanto hanno quasi lo stesso tipo di struttura. Quindi, dovrai analizzarli per ottenere informazioni vitali, proprio come faresti quando si lavora con HTML.Esistono due aspetti principali nell'analisi dei file XML. Sono:

  • Trovare tag
  • Estrazione da tag

Dovrai trovare il tag che contiene le informazioni desiderate, quindi estrarre tali informazioni. Imparerai come fare entrambi quando si lavora con i file XML prima della fine di questo articolo.

Installazione

Beautifulsoup è una delle librerie più utilizzate quando si tratta di raschiatura del web con Python. Poiché i file XML sono simili ai file HTML, è anche in grado di analizzarli. Per analizzare i file XML usando BeautifulSoup, è meglio che tu faccia uso di Python lxml parser.

È possibile installare entrambe le librerie utilizzando il PIP Strumento di installazione, tramite il comando di seguito:

PIP Installa BS4 LXML

Per confermare che entrambe le librerie sono installate correttamente, è possibile attivare la shell interattiva e provare a importare entrambi. Se non viene visualizzato alcun errore, allora sei pronto per andare con il resto dell'articolo.

Ecco un esempio:

$ Python
Python 3.7.4 (tag/v3.7.4: E09359112E, 8 luglio 2019, 20:34:20)
[MSC v.1916 64 bit (AMD64)] su Win32
Digita "Help", "Copyright", "Credit" o "Licenza" per ulteriori informazioni.
>>> Importa BS4
>>> Importa lxml
>>>

Prima di andare avanti, è necessario creare un file XML dallo snippet di codice di seguito. È abbastanza semplice e dovrebbe adattarsi ai casi d'uso che imparerai nel resto dell'articolo. Basta copiare, incollare nel tuo editore e salvare; un nome come campione.XML dovrebbe essere sufficiente.



L'albero

Primo
Secondo

Terzo

Uno
Due
Gemelli


Il quarto

Ora, nella tua sceneggiatura Python; Dovrai leggere il file XML come un file normale, quindi passarlo in BeautifulSoup. Il resto di questo articolo userà bs_content variabile, quindi è importante fare questo passo.

# Importa bellissimasoup
da BS4 Import Beautifulsoup come BS
content = []
# Leggi il file XML
con aperto ("campione.xml "," r ") come file:
# Leggi ogni riga nel file, readlines () restituisce un elenco di righe
content = file.readlines ()
# Combina le righe nell'elenco in una stringa
content = "".Iscriviti (Contenuto)
bs_content = bs (contenuto, "lxml")

Il campione di codice sopra importanti Bellissimo, Quindi legge il file XML come un file normale. Successivamente, passa il contenuto al importato Bellissimo biblioteca e parser di scelta.

Noterai che il codice non importa lxml. Non deve come Bellissimo Sceglierò il lxml parser a seguito del passaggio "LXML" nell'oggetto.

Ora puoi procedere con il resto dell'articolo.

Trovare tag

Una delle fasi più importanti dell'analisi dei file XML è la ricerca di tag. Esistono vari modi per farlo quando usi bellissimi; Quindi devi conoscerne una manciata per avere gli strumenti migliori per la situazione appropriata.

Puoi trovare tag nei documenti XML di:

  • Nomi
  • Relazioni

Trovare tag per nomi

Esistono due metodi di bellasoup che puoi usare quando trovi tag per nomi. Tuttavia, i casi d'uso differiscono; Diamo un'occhiata a loro.

Trovare

Dall'esperienza personale, utilizzerai il Trovare metodo più spesso degli altri metodi per trovare tag in questo articolo. Il tag Find riceve il nome del tag che desideri ottenere e restituisce un oggetto per bellissimo tag se ne trova uno; altro, ritorna Nessuno.

Ecco un esempio:

>>> risultato = bs_content.Trova ("dati")
>>> stampa (risultato)
Uno
>>> risultato = bs_content.Trova ("unico")
>>> stampa (risultato)
Gemelli
>>> risultato = bs_content.Trova ("Padre")
>>> stampa (risultato)
Nessuno
>>> risultato = bs_content.Trova ("Madre")
>>> stampa (risultato)
Nessuno

Se dai un'occhiata all'esempio, vedrai che il Trovare Il metodo restituisce un tag se corrisponde al nome, altrimenti non restituisce nessuno. Tuttavia, se dai un'occhiata più da vicino, vedrai che restituisce solo un singolo tag.

Ad esempio, quando Trova ("dati") è stato chiamato, ha restituito solo il primo tag di dati, ma non ha restituito gli altri.

Gotcha: IL Trovare Il metodo restituirà solo il primo tag che corrisponde alla sua domanda.

Allora come riesci a trovare anche altri tag? Questo ci porta al metodo successivo.

trova tutto

IL trova tutto Il metodo è abbastanza simile al Trovare metodo. L'unica differenza è che restituisce un elenco di tag che corrispondono alla sua domanda. Quando non trova alcun tag, restituisce semplicemente un elenco vuoto. Quindi, trova tutto restituirà sempre un elenco.

Ecco un esempio:

>>> risultato = bs_content.find_all ("dati")
>>> stampa (risultato)
[Uno, Due"
>>> risultato = bs_content.find_all ("bambino")
>>> stampa (risultato)
[Primo, Secondo,
Terzo

Uno
Due
Gemelli

,
Il quarto"
>>> risultato = bs_content.find_all ("padre")
>>> stampa (risultato
[
>>> risultato = bs_content.find_all ("madre")
>>> stampa (risultato)
[

Ora che sai come usare il Trovare E trova tutto Metodi, puoi cercare tag ovunque nel documento XML. Tuttavia, puoi rendere le tue ricerche più potenti.

Ecco come:

Alcuni tag possono avere lo stesso nome, ma attributi diversi. Ad esempio, il bambino I tag hanno un nome attributo e valori diversi. Puoi effettuare ricerche specifiche in base a quelle.

Dai un'occhiata a questo:

>>> risultato = bs_content.find ("Child", "nome": "rose")
>>> stampa (risultato)
Secondo
>>> risultato = bs_content.find_all ("figlio", "nome": "rose")
>>> stampa (risultato)
[Secondo"
>>> risultato = bs_content.find ("Child", "nome": "jack")
>>> stampa (risultato)
Primo
>>> risultato = bs_content.find_all ("figlio", "nome": "jack")
>>> stampa (risultato)
[Primo"

Vedrai che c'è qualcosa di diverso nell'uso del Trovare E trova tutto Metodi qui: entrambi hanno un secondo parametro.

Quando passi in un dizionario come secondo parametro, il Trovare E trova tutto Metodi ulteriormente la loro ricerca per ottenere tag che dispongono di attributi e valori che si adattano alla chiave fornita: valori.

Ad esempio, nonostante usi il Trovare metodo nel primo esempio, ha restituito il secondo bambino tag (invece del primo bambino tag), perché questo è il primo tag che corrisponde alla query. IL trova tutto Tag segue lo stesso principio, tranne per il fatto che restituisce tutti i tag che corrispondono alla query, non solo il primo.

Trovare tag da parte delle relazioni

Sebbene meno popolare della ricerca con i nomi dei tag, puoi anche cercare tag tramite relazioni. Nel vero senso, però, è più di navigare che cercare.

Ci sono tre relazioni chiave nei documenti XML:

  • Genitore: Il tag in cui esiste il tag di riferimento.
  • Bambini: I tag esistono nel tag di riferimento.
  • Fratelli: I tag che esistono allo stesso livello del tag di riferimento.

Dalla spiegazione sopra, si può dedurre che il tag di riferimento è il fattore più importante nella ricerca di tag da parte delle relazioni. Quindi, cerchiamo il tag di riferimento e continuiamo l'articolo.

Guarda questo:

>>> terzo_child = bs_content.Find ("Child", "Nome": "Blue Ivy")
>>> stampa (terzo_child)

Terzo

Uno
Due
Gemelli

Dal campione di codice sopra, il tag di riferimento per il resto di questa sezione sarà il terzo bambino tag, memorizzato in un file Terzo_Child variabile. Nelle sottosezioni seguenti, vedrai come cercare tag in base alle relazioni dei loro genitori, fratelli e bambini con il tag di riferimento.

Trovare genitori

Per trovare il tag principale di un tag di riferimento, utilizzerai genitore attributo. Fare questo restituisce il tag principale, così come i tag sotto di esso. Questo comportamento è abbastanza comprensibile, poiché i tag dei bambini fanno parte del tag genitore.

Ecco un esempio:

>>> risultato = terzo_child.genitore
>>> stampa (risultato)

Primo
Secondo

Terzo

Uno
Due
Gemelli


Il quarto

Trovare bambini

Per trovare i tag dei bambini di un tag di riferimento, utilizzerai bambini attributo. Fare questo restituisce i tag dei bambini, così come i sotto-tag sotto ciascuno di essi. Questo comportamento è anche comprensibile, poiché i tag dei bambini hanno spesso tag dei propri figli.

Una cosa che dovresti notare è che il bambini L'attributo restituisce i tag per bambini come generatore. Quindi, se hai bisogno di un elenco dei tag per bambini, dovrai convertire il generatore in un elenco.

Ecco un esempio:

>>> risultato = elenco (terzo_child.bambini)
>>> stampa (risultato)
['\ n terzo \ n',
Uno
Due
Gemelli
, '\N']

Se dai un'occhiata più da vicino all'esempio sopra, noterai che alcuni valori nell'elenco non sono tag. È qualcosa a cui devi fare attenzione.

Gotcha: IL bambini L'attributo non restituisce solo i tag per bambini, restituisce anche il testo nel tag di riferimento.

Trovare fratelli

L'ultimo in questa sezione è trovare tag che sono fratelli per il tag di riferimento. Per ogni tag di riferimento, potrebbero esserci tag tra fratelli prima e dopo. IL Precedenti_siblings L'attributo restituirà i tag di fratelli prima del tag di riferimento e il Next_siblings L'attributo restituirà i tag di fratelli dopo di esso.

Proprio come il bambini attributo, il Precedenti_siblings E Next_siblings Gli attributi restituiranno i generatori. Quindi devi convertire in un elenco se hai bisogno di un elenco di fratelli.

Guarda questo:

>>> precedente_siblings = elenco (terzo_child.precedente_siblings)
>>> stampa (precedente_siblings)
['\N', Secondo, '\N',
Primo, '\N']
>>> next_siblings = elenco (terzo_child.Next_siblings)
>>> stampa (next_siblings)
['\N', Il quarto"
>>> stampa (precedente_siblings + next_siblings)
['\N', Secondo, '\N', Primo,
'\ n', '\ n', Il quarto, '\N']

Il primo esempio mostra i fratelli precedenti, il secondo mostra i fratelli successivi; Quindi entrambi i risultati vengono combinati per generare un elenco di tutti i fratelli per il tag di riferimento.

Estrazione da tag

Quando si analizzano i documenti XML, gran parte del lavoro sta nel trovare i tag giusti. Tuttavia, quando li trovi, potresti anche voler estrarre determinate informazioni da quei tag, ed è quello che questa sezione ti insegnerà.

Vedrai come estrarre quanto segue:

  • Valori degli attributi tag
  • Tag testo
  • Contenuto del tag

Valori degli attributi del tag di estrazione

A volte, potresti avere un motivo per estrarre i valori per gli attributi in un tag. Nel seguente accoppiamento del valore attributo per esempio: name = "rose", potresti voler estrarre “Rose."

Per fare questo, puoi utilizzare il Ottenere metodo o accedere al nome dell'attributo usando [ Come un indice, proprio come faresti quando lavori con un dizionario.

Ecco un esempio:

>>> risultato = terzo_child.get ("nome")
>>> stampa (risultato)
Ivy blu
>>> risultato = terzo_child ["nome"]
>>> stampa (risultato)
Ivy blu

Estrazione del testo del tag

Quando si desidera accedere ai valori di testo di un tag, è possibile utilizzare il testo O stringhe attributo. Entrambi restituiranno il testo in un tag e persino i tag dei bambini. comunque, il testo L'attributo li restituirà come una singola stringa, concatenata; mentre il stringhe L'attributo li restituirà come un generatore che puoi convertire in un elenco.

Ecco un esempio:

>>> risultato = terzo_child.testo
>>> stampa (risultato)
'\ n terzo \ n \ non \ ntwo \ ntwins \ n \ n'
>>> risultato = elenco (terzo_child.stringhe)
>>> stampa (risultato)
['\ n terzo \ n', '\ n', 'one', '\ n', 'due', '\ n', 'twins', '\ n', '\ n']

Estrazione del contenuto di tag

Ai sensi dell'estrazione dei valori degli attributi e del testo del tag, è anche possibile estrarre tutto il contenuto di tag. Per fare questo, puoi usare il Contenuti attributo; è un po 'simile a bambini attributo e produrrà gli stessi risultati. Tuttavia, mentre il bambini L'attributo restituisce un generatore, il Contenuti L'attributo restituisce un elenco.

Ecco un esempio:

>>> risultato = terzo_child.Contenuti
>>> stampa (risultato)
['\ n terzo \ n',
Uno
Due
Gemelli
, '\N']

Stampa bella

Finora, hai visto alcuni metodi e attributi importanti che sono utili quando si analizzano documenti XML usando BeautifulSoup. Ma se noti, quando si stampano i tag sullo schermo, hanno una sorta di look cluster. Mentre l'aspetto potrebbe non avere un impatto diretto sulla tua produttività, può aiutarti a analizzare in modo più efficace e rendere il lavoro meno noioso.

Ecco un esempio di stampa in modo normale:

>>> stampa (terzo_child)

Terzo

Uno
Due
Gemelli

Tuttavia, puoi migliorare il suo aspetto usando il abbellire metodo. Chiama semplicemente il abbellire metodo sul tag durante la stampa e otterrai qualcosa di visivamente piacevole.

Guarda questo:

Conclusione

I documenti di analisi sono un aspetto importante dell'approvvigionamento per i dati. I documenti XML sono piuttosto popolari e spero che tu sia meglio attrezzato per affrontarli ed estrarre i dati che desideri.

Da questo articolo, ora sei in grado di:

  • Cerca tag per nomi o relazioni
  • Estrai dati dai tag

Se ti senti abbastanza perso e sei piuttosto nuovo nella biblioteca di Beautifulsoup, puoi dare un'occhiata al tutorial per i principianti.