Ho cercato di analizzare alcuni enormi file XML che LXML non ghermire, quindi sono costretto a analizzarli con xml.sax
.Come restituire i dati da un parser Python SAX?
class SpamExtractor(sax.ContentHandler):
def startElement(self, name, attrs):
if name == "spam":
print("We found a spam!")
# now what?
Il problema è che non capisco come in realtà return
, o meglio, yield
, le cose che questo gestore ritrova al chiamante, senza attendere l'intero file da analizzare. Finora, ho lavorato con threading.Thread
e Queue.Queue
, ma questo porta a tutti i tipi di problemi con i thread che mi distolgono davvero dal problema reale che sto cercando di risolvere.
So che potrei eseguire il parser SAX in un processo separato, ma ritengo che ci sia un modo più semplice per ottenere i dati. È lì?
+1 ma aggiungerei quanto segue: (1) uso 'cElementTree', non' ElementTree' (2) 'lxml' ha anche un' iterparse' che fornisce la stessa o migliore funzionalità (3) è necessario menzionare l'eliminazione nodi dopo aver estratto le informazioni richieste (4) AFAICT (mai provato) un generatore dovrebbe funzionare OK –
Vite SAX, sto andando con 'iterparse'! Grazie mille! –
@JohnMachin Non sapevo che esistesse cElementTree - ovviamente, dove è necessaria la velocità, sarebbe una buona scelta - ma non vedo alcun motivo per cui la coperta suggerisca che è un uso in cui la velocità non è una priorità elevata.
Per quanto riguarda l'eliminazione dei nodi, non vedo dove sia necessario, potresti spiegare?- Spiegato pochi secondi dopo dai larsman. –