Ci sono due aspetti principali nell'analisi dei file XML. Sono:
- Trovare i tag
- Estrazione dai tag
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 lxmlPer 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:
$pythonPitone 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
Terzo
Uno
Due
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 BeautifulSoupda 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:
- nomi
- Relazioni
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)
>>> 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)
[
Terzo
Uno
Due
>>> 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)
>>> risultato = bs_content.find_all("figlio", "nome": "Rosa")
>>> stampa (risultato)
[
>>> risultato = bs_content.find("figlio", "nome": "Jack")
>>> stampa (risultato)
>>> risultato = bs_content.find_all("figlio", "nome": "Jack")
>>> stampa (risultato)
[
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:
- Genitore: Il tag in cui esiste il tag di riferimento.
- Bambini: I tag che esistono nel tag di riferimento.
- fratelli: I tag che esistono allo stesso livello del tag di riferimento.
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
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)
Terzo
Uno
Due
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
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',
>>> next_siblings = list(terzo_figlio.prossimi_fratelli)
>>> print(prossimo_fratelli)
['\n',
>>> print(fratelli_precedenti + fratelli_successivi)
['\n',
'\n', '\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:
- Valori degli attributi dei tag
- Testo tag Tag
- Tagga il contenuto
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
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
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:
- cerca i tag per nome o per relazione
- estrarre i dati dai tag
Se ti senti abbastanza perso e sei abbastanza nuovo nella libreria BeautifulSoup, puoi dare un'occhiata al tutorial BeautifulSoup per principianti.