Tag Archives: parsing

Parsing di file XML con Python e lxml

Da quando Ajax, le applicazioni Web ed il cloud computing si sono grandemente diffusi, è sempre più importante scegliere il miglior protocollo di comunicazione tramite il quale rendere semplice e veloce la comunicazione tra Client e Server.

Le uniche due specifiche standard per l’interscambio di dati stutturati tra un Browser e un Server (ospitante API) sono JSON ed XML. Entrambi i protocolli hanno vantaggi e svantaggi ed entrambi aggiungono overhead alla comunicazione; per JSON però esistono librerie di semplice utilizzo che con poche righe di codice permettono la serializzazione e la de-serializzazione dei dati trasferiti, mentre per XML tutto è leggermente più complicato.

Oggi vedremo in azione Python che grazie ad LXML mette a disposizione ottimi strumenti per il parsing di dati strutturati con XML. LXML offre strumenti per XML, HTML ed HTML5 ma anche per CSS.

LXML vanta ottime prestazioni, sicuramente le migliori su Python, essendo direttamente sviluppato sulle API della potente libreria libxml2. Qui potete trovare dei benchmark dal sito ufficiale di LXML e dal blog di Ian Bicking, nel blog di Ian emerge che LXML ottiene le migliori prestazioni nel Parsing e nella Serializzazione pur richiedendo una superiore quantità di Ram. LXML è inoltre una libreria solida e stabile. Utilizzo io stesso LXML in produzione su alcuni Server Web per l’intescambio di dati in applicazioni Web ed applicazioni cloud.

Eseguire il parsing di dati XML è molto semplice, soprattutto utilizzando Xpath, e permette un buon livello di flessibilità. Per l’esempio è stato utilizzato un file XML contenente Feed RSS non molto complesso, ma giungiamo subito al codice.


#Importiamo la libreria html, xpath è compatibile sia con HTML che XML
#per comodità utilizziamo un Alias (parser)
from lxml.html as parser

#Apriamo in maniera tradizionale il file XML
f = open("myXML.xml")
file = f.read()

#Importiamo l'XML in un oggetto lxml
xmlDoc = parser.document_fromstring(file)
for item in xmlDoc.xpath("//item"):

#Estraiamo il contenuto testuale del nodo XML
print item.text_content()

#Estraiamo dati dagli attributi del nodo XML
print item.attrib['attribName']

La riga più interessante è quella che contiene xmlDoc.xpath che vuole come argomento il nome del tag xml/html da estrarre dal documento XML, ovviamente è possibile anche effettuare selezioni di nodi più complesse di quella nell’esempio ma un parsing tradizionale è sempre il punto di partenza.