[Python-de] XML mit LXML einlesen, wobei die Struktur nicht alltäglich ist.

Thomas Gebhard info at tomjones.ch
Di Mär 24 11:58:39 CET 2009


Hallo Python-De Mailingliste,

ich habe für euch eine knifflige Aufgabe. Diese habe  ich zwar gelöst
habe, jedoch mit einem hässlichem workaround. Im speziellem muss ich
mehrere XML Files auslesen, die in Summe ca. 140GB Blog Daten enthalten.
Die Einträge im XML File beginnen alle mit:

<item>
</item>
<item>
....

dies bedeutet, dass die Files KEIN Root Element enthalten. Hier hatte
ich schon mein erstes Problem.
Denn wie kann man mit LXML ein File parsen, sei es mit dem parser als
auch mit dem Iterparser,
wenn es kein Root Element beinhaltet. Ich habe immer nur das erste Item
erhalten, und die restlichen waren für
mich unsichtbar.

Dies habe ich nun gelöst, indem ich zu Beginn <root> und am Ende des
Files </root> hinzugefügt habe.
Wie bereits gesagt, eine nicht sehr schöne Notlösung.
Habt ihr eine Idee wie das auch anders gehen könnte?

Das zweite Problem das ich hatte, war dass es Element gibt die wie folgt
ausschauen:
<source:title></source:title>
<weblog:weblog_type></weblog:weblog_type>

LXML interpretierte hier immer source als auch weblog als Namespaces,
die im Header jedoch nicht definiert wurden. Ich kann diese Einträge nun
auch nicht ändern, da ich diese Daten so erhalten habe, und es keine
weiteren Zusatzinformationen dazu gibt. Ich hab hier nun beim XMLParser
den tag recover=True verwendet.
Auch hier möchte ich euch fragen, ob dies die Einzige Lösung ist? Oder
ihr vielleicht einen besseren Lösungsansatz vorschlagen könntet?

Der Sourcecode sieht wie folgt aus:
    parser = etree.XMLParser(recover=True)
    infile = 'part-1.xml'
    results = etree.parse(infile, parser)   
   
    count_en_blogs = 0
    sum = 0
    for e in results.getiterator('item'):
        if 'en' == e.find('lang').text:
            #print e.find('lang').text
            count_en_blogs += 1
            sum +=1
        else:
            sum +=1
   
    print ("Die Resource beinhaltet %s Englische Blogeintraege und
gesamt %s Eintraege"
    ) %(count_en_blogs, sum)


Vielen dank im voraus für jegliche Anwort.

lg,
Tom





Mehr Informationen über die Mailingliste python-de