Próbowałem przeanalizować kilka ogromnych plików XML, których nie ma w LXML, więc jestem zmuszony je przeanalizować przy pomocy xml.sax
.Jak zwrócić dane z parsera Python SAX?
class SpamExtractor(sax.ContentHandler):
def startElement(self, name, attrs):
if name == "spam":
print("We found a spam!")
# now what?
Problemem jest to, że nie rozumiem, jak to faktycznie return
, albo lepiej, yield
, rzeczy, że uchwyt ten znajdzie się rozmówcy, nie czekając na całego pliku do analizowany. Do tej pory robiłem sobie z tym problem z threading.Thread
i Queue.Queue
, ale to prowadzi do różnego rodzaju problemów z wątkami, które naprawdę odciągają mnie od rzeczywistego problemu, który próbuję rozwiązać.
Wiem, że mógłbym uruchomić parser SAX w oddzielnym procesie, ale uważam, że musi istnieć prostszy sposób na wyodrębnienie danych. Jest tu?
+1, ale dodam: (1) użyj 'cElementTree', a nie' ElementTree' (2) 'lxml' ma również' iterparse', który zapewnia taką samą lub lepszą funkcjonalność (3), o której musisz wspomnieć usunięcie węzły po wyodrębnieniu wymaganych informacji (4) AFAICT (nigdy nie próbowałem) generator powinien działać OK –
Śruba SAX, idę z 'iterparse'! Dzięki stosy! –
@JohnMachin Nie wiedziałem, że cElementTree istnieje - oczywiście, tam, gdzie potrzebna jest szybkość, byłby to dobry wybór - ale nie widzę żadnego powodu, by sugerować, że jest to miejsce, gdzie prędkość nie jest priorytetem.
Co do usuwania węzłów, nie widzę, gdzie to jest potrzebne, czy możesz wyjaśnić?- Wyjaśnione kilka sekund później przez larsmanów. –