bellazuppa

Come analizzare i file XML usando BeautifulSoup di Python

Come analizzare i file XML usando BeautifulSoup di Python
I dati sono letteralmente ovunque, in tutti i tipi di documenti. Ma non tutto è utile, da qui la necessità di analizzarlo per ottenere le parti necessarie. I documenti XML sono uno di quei documenti che contengono dati. Sono molto simili ai file HTML, poiché hanno quasi lo stesso tipo di struttura. Quindi, dovrai analizzarli per ottenere informazioni vitali, proprio come faresti quando lavori con HTML.

Ci sono due aspetti principali nell'analisi dei file XML. Sono:

Dovrai trovare il tag che contiene le informazioni che desideri, quindi estrarre tali informazioni. Imparerai come fare entrambe le cose quando lavori con file XML prima della fine di questo articolo.

Installazione

BeautifulSoup è una delle librerie più utilizzate quando si tratta di web scraping con Python. Poiché i file XML sono simili ai file HTML, è anche in grado di analizzarli. Tuttavia, per analizzare i file XML utilizzando BeautifulSoup, è meglio utilizzare Python Python lxml analizzatore.

Puoi installare entrambe le librerie usando pip strumento di installazione, tramite il comando seguente:

pip install bs4 lxml

Per confermare che entrambe le librerie sono installate con successo, puoi attivare la shell interattiva e provare a importarle entrambe. Se non viene visualizzato alcun errore, sei pronto per il resto dell'articolo.

Ecco un esempio:

$python
Pitone 3.7.4 (tag/v3.7.4:e09359112e, 8 luglio 2019, 20:34:20)
[MSC v.1916 64 bit (AMD64)] su win32
Digita "aiuto", "copyright", "crediti" o "licenza" per ulteriori informazioni.
>>> importa bs4
>>> importa lxml
>>>

Prima di andare avanti, dovresti creare un file XML dal frammento di codice qui sotto. È abbastanza semplice e dovrebbe adattarsi ai casi d'uso che imparerai nel resto dell'articolo. Basta copiare, incollare nel tuo editor e salvare; un nome come campione.xml dovrebbe bastare.



L'albero

Primo
Secondo

Terzo

Uno
Due
Gemelli


Il quarto

Ora, nel tuo script Python; dovrai leggere il file XML come un normale file, quindi passarlo a BeautifulSoup. Il resto di questo articolo farà uso del bs_content variabile, quindi è importante che tu faccia questo passaggio.

# Importa BeautifulSoup
da bs4 import BeautifulSoup come bs
contenuto = []
# Leggi il file XML
con open("campione.xml", "r") come file:
# Legge ogni riga nel file, readlines() restituisce un elenco di righe
contenuto = file.righe di lettura()
# Combina le righe della lista in una stringa
contenuto = "".partecipare (contenuto)
bs_content = bs(contenuto, "lxml")

L'esempio di codice sopra viene importato bellazuppa, quindi legge il file XML come un file normale. Successivamente, passa il contenuto nell'importato bellazuppa libreria così come il parser di scelta.

Noterai che il codice non viene importato lxml. Non deve come bellazuppa sceglierà il lxml parser come risultato del passaggio “lxml” nell'oggetto.

Ora puoi procedere con il resto dell'articolo.

Trovare i tag

Una delle fasi più importanti dell'analisi dei file XML è la ricerca di tag. Ci sono vari modi per farlo quando si usa BeautifulSoup; quindi è necessario conoscerne una manciata per avere gli strumenti migliori per la situazione appropriata.

Puoi trovare tag nei documenti XML tramite:

Trovare i tag per nome

Ci sono due metodi BeautifulSoup che puoi usare quando trovi i tag per nome. Tuttavia, i casi d'uso differiscono; diamo un'occhiata a loro.

trova

Per esperienza personale, utilizzerai il trova metodo più spesso degli altri metodi per trovare i tag in questo articolo. Il tag find riceve il nome del tag che si desidera ottenere e restituisce un oggetto BeautifulSoup del tag se ne trova uno; altrimenti ritorna Nessuna.

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)
Nessuna
>>> risultato = bs_content.trova ("madre")
>>> stampa (risultato)
Nessuna

Se dai un'occhiata all'esempio, vedrai che il trova il metodo restituisce un tag se corrisponde al nome, altrimenti 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.

OTTIMO: Il trova Il metodo restituirà solo il primo tag che corrisponde alla sua query.

Quindi, come fai a trovare anche altri tag?? Questo ci porta al metodo successivo.

trova tutto

Il trova tutto il metodo è abbastanza simile a trova metodo. L'unica differenza è che restituisce un elenco di tag che corrispondono alla sua query. Quando non trova alcun tag, restituisce semplicemente un elenco vuoto. Quindi, trova tutto restituirà sempre una lista.

Ecco un esempio:

>>> risultato = bs_content.find_all("dati")
>>> stampa (risultato)
[Uno, Due]
>>> risultato = bs_content.find_all("figlio")
>>> 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 trova 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 fare ricerche specifiche in base a quelle.

Dai un'occhiata a questo:

>>> risultato = bs_content.find("figlio", "nome": "Rosa")
>>> stampa (risultato)
Secondo
>>> risultato = bs_content.find_all("figlio", "nome": "Rosa")
>>> stampa (risultato)
[Secondo]
>>> risultato = bs_content.find("figlio", "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 trova e trova tutto metodi qui: entrambi hanno un secondo parametro.

Quando passi un dizionario come secondo parametro, il trova e trova tutto metodi ulteriormente la loro ricerca per ottenere tag che hanno attributi e valori che si adattano alla coppia chiave:valore fornita.

Ad esempio, nonostante l'utilizzo di trova metodo nel primo esempio, ha restituito il secondo bambino tag (invece del primo bambino tag), perché è 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 per relazioni

Sebbene sia meno popolare della ricerca per nome di tag, puoi anche cercare i tag per relazione. Nel vero senso, però, è più una navigazione che una ricerca.

Esistono tre relazioni chiave nei documenti XML:

Dalla spiegazione sopra, puoi dedurre che il tag di riferimento è il fattore più importante nella ricerca di tag per relazioni. Quindi, cerchiamo il tag di riferimento e continuiamo l'articolo.

Guarda questo:

>>> terzo_figlio = bs_content.find("figlio", "nome": "Blue Ivy")
>>> print(terzo_figlio)

Terzo

Uno
Due
Gemelli

Dall'esempio di codice sopra, il tag di riferimento per il resto di questa sezione sarà il terzo bambino tag, memorizzato in a terzo_figlio variabile. Nelle sottosezioni seguenti, vedrai come cercare i tag in base alla loro relazione genitore, fratello e figlio con il tag di riferimento.

Trovare i Genitori

Per trovare il tag genitore di un tag di riferimento, utilizzerai il genitore attributo. In questo modo si restituisce il tag genitore, così come i tag sotto di esso. Questo comportamento è abbastanza comprensibile, dal momento che i tag figli fanno parte del tag genitore.

Ecco un esempio:

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

Primo
Secondo

Terzo

Uno
Due
Gemelli


Il quarto

Trovare i bambini

Per trovare i tag figli di un tag di riferimento, utilizzerai il bambini attributo. In questo modo vengono restituiti i tag figli, nonché i tag secondari sotto ciascuno di essi. Anche questo comportamento è comprensibile, poiché spesso anche i tag figli hanno i propri tag figli.

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

Ecco un esempio:

>>> risultato = lista(terzo_figlio.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 stare attento.

OTTIMO: Il bambini attributo non restituisce solo i tag figli, ma restituisce anche il testo nel tag di riferimento.

Trovare fratelli

L'ultimo in questa sezione è trovare i tag che sono fratelli del tag di riferimento. Per ogni tag di riferimento, potrebbero esserci tag di pari livello prima e dopo di esso. Il fratelli_precedenti attributo restituirà i tag di pari livello prima del tag di riferimento e il next_siblings l'attributo restituirà i tag di pari livello dopo di esso.

Proprio come il bambini attributo, il fratelli_precedenti e next_siblings gli attributi restituiranno generatori. Quindi devi convertire in un elenco se hai bisogno di un elenco di fratelli.

Guarda questo:

>>> precedenti_fratelli = lista(terzo_figlio.precedente_fratelli)
>>> print(precedente_fratelli)
['\n', Secondo, '\n',
Primo, '\n']
>>> next_siblings = list(terzo_figlio.prossimi_fratelli)
>>> print(prossimo_fratelli)
['\n', Il quarto]
>>> print(fratelli_precedenti + fratelli_successivi)
['\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 dai tag

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

Vedrai come estrarre quanto segue:

Estrazione dei valori degli attributi dei tag

A volte, potresti avere un motivo per estrarre i valori per gli attributi in un tag. Nella seguente coppia attributo-valore, ad esempio: nome=”Rosa”, potresti voler estrarre "Rose."

Per fare ciò, puoi utilizzare il ottenere o accedendo al nome dell'attributo usando [] come un indice, proprio come faresti quando lavori con un dizionario.

Ecco un esempio:

>>> risultato = terzo_figlio.get("nome")
>>> stampa (risultato)
Edera blu
>>> risultato = terzo_figlio["nome"]
>>> stampa (risultato)
Edera blu

Estrazione del testo del tag

Quando vuoi accedere ai valori di testo di un tag, puoi usare il use testo o stringhe attributo. Entrambi restituiranno il testo in un tag e anche i tag figli. comunque, il testo l'attributo li restituirà come una singola stringa, concatenata; mentre il stringhe attributo li restituirà come un generatore che puoi convertire in una lista.

Ecco un esempio:

>>> risultato = terzo_figlio.testo
>>> stampa (risultato)
'\n    Terzo\n      \nUno\nDue\nGemelli\n\n'
>>> risultato = lista(terzo_figlio.stringhe)
>>> stampa (risultato)
['\n  Terzo\n      ', '\n', 'Uno', '\n', 'Due', '\n', 'Gemelli', '\n', '\n']

Estrazione del contenuto dei tag

Oltre a estrarre i valori degli attributi e il testo del tag, puoi anche estrarre tutto il contenuto di un tag. Per fare ciò, puoi utilizzare 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 una lista.

Ecco un esempio:

>>> risultato = terzo_figlio.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 stampi i tag sullo schermo, hanno una sorta di aspetto a grappolo. Sebbene l'aspetto possa non avere un impatto diretto sulla tua produttività, può aiutarti ad analizzare in modo più efficace e rendere il lavoro meno noioso.

Ecco un esempio di stampa nel modo normale:

>>> print(terzo_figlio)

Terzo

Uno
Due
Gemelli

Tuttavia, puoi migliorarne l'aspetto usando il abbellire metodo. Chiama semplicemente il abbellire metodo sull'etichetta durante la stampa e otterrai qualcosa di visivamente piacevole.

Guarda questo:

Conclusione

L'analisi dei documenti è un aspetto importante del reperimento dei dati. I documenti XML sono piuttosto popolari e si spera che tu sia meglio attrezzato per accettarli ed estrarre i dati che desideri.

Da questo articolo, ora puoi:

Se ti senti abbastanza perso e sei abbastanza nuovo nella libreria BeautifulSoup, puoi dare un'occhiata al tutorial BeautifulSoup per principianti.

Come sviluppare un gioco su Linux
Un decennio fa, non molti utenti Linux avrebbero previsto che il loro sistema operativo preferito un giorno sarebbe diventato una piattaforma di gioco...
Porte open source di motori di gioco commerciali
Ricreazioni del motore di gioco gratuite, open source e multipiattaforma possono essere utilizzate per riprodurre titoli di giochi vecchi e abbastanza...
I migliori giochi da riga di comando per Linux
La riga di comando non è solo il tuo più grande alleato quando usi Linux, ma può anche essere una fonte di intrattenimento perché puoi usarla per gioc...