`BeautifulStoneSoup` ist nicht gerade das ideale Werkzeug um XML zu parsen. Das Modul ist für kaputtes (X)HTML gedacht. Bei "echtem" XML sollte man aber erwarten können, das es auch wohlgeformt ist und die entsprechenden XML-Werkzeuge verwenden.
Problem ist, das HTML bei Tags keinen Unterschied zwischen Gross- und Kleinschschreibung macht und `BeautifulSoup` deshalb alle Tags in klein Geschriebene umwandelt. Deshalb wird bei ``soup('Message')`` nichts gefunden.
Ein ``print soup`` hätte das sehr schnell aufgedeckt.
ok hab auch gelesen das ElementTree eine besser Lösung ist.
ich hab jetzt noch folgendes Problem
Mein Code sieht mittleweile so aus und ist in einer Datei
from xml.etree import ElementTree as et
files = file("detailedReport.xml", "r")
etree = et.parse(files)
files.close()
root_tag = etree.getroot()
files_tag = root_tag.find("BaselineReport")
if files_tag:
for file_tag in files_tag.findall("Message"):
print file_tag.get("Agent")
print " " + (file_tag.text or "")
edit:
so hab jetzt mal weiter probiert und raus bekommen das der BaselineReport nicht findet und deswegen erst garnicht den if teil ausführt
Zuletzt geändert von madthomas am Donnerstag 10. Juli 2008, 09:39, insgesamt 1-mal geändert.
from xml.etree import ElementTree as et
files = file("detailedReport.xml", "r")
etree = et.parse(files)
files.close()
root_tag = etree.getroot()
for message in root_tag.findall("Message"):
print message.find("Agent").text
from xml.etree import ElementTree as et
files = file("detailedReport.xml", "r")
etree = et.parse(files)
files.close()
root_tag = etree.getroot()
for message in root_tag.findall("Message"):
print message.find("Agent").text
das funktiert irgendwie nicht der findet Message nicht
Der Inhalt deiner XML Datei sieht (laut deinem Beispiel) so aus:
In [35]: cpaste
Pasting code; enter '--' alone on the line to stop.
:from xml.etree import ElementTree as et
:
:files = file("detailedReport.xml", "r")
:etree = et.parse(files)
:files.close()
:root_tag = etree.getroot()
:for message in root_tag.findall("Message"):
: print message.find("Agent").text
:--
Superman
Superman
ile "XMLparser.py", line 14, in <module>
print ("%s;%s" % (time,text))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 65: ordinal not in range(128)
# -*- coding: iso-8859-1 -*-
import sys
from xml.etree import ElementTree as et
files = file("detailedReport.xml", "r")
etree = et.parse(files)
files.close()
out_file = open("test.csv", "w")
root_tag = etree.getroot()
for messagelist in root_tag.findall("MessageList"):
for message in messagelist.findall("Message"):
time = message.find("Time").text
text = message.find("Text").text
text = text.strip()
print ("%s;%s" % (time,text))
out_file.write("%s;%s" % (time, text))#habs hier auch mal mit encode('utf-8') versucht aber er findet im ersten satz kein umlaut und bricht dann ab
out_file.write("\n")
out_file.close()
Wenn `unicode`-Objekte das Programm verlassen, sei es durch ``print`` oder schreiben in eine Datei, müssen sie in Bytes umgewandelt werden, also "gewöhnliche" `str`-Objekte. Bei ``print`` kann man Glück haben, dass Python heraus finden konnte, was zum Beispiel die Standardausgabe für eine Kodierung erwartet, aber spätestens bei Dateien kann man das nicht mehr automatisch ermitteln und Du musst explizit die `encode()`-Methode mit einer passenden Kodierung verwenden. Oder die Datei mit `codecs.open()` öffnen.
Definiere "klappt nicht". Ich sehe da auf den ersten Blick schonmal einen bösen Einrückungsfehler. Und natürlich kann Dir das ``print`` noch Probleme machen, wenn der Interpreter nicht erraten kann, was das Programm am anderen Ende von `sys.stdout` für eine Kodierung erwartet.
Ok es lag wirklich am print.
Jetzt hab ich nur noch ein Problem. Immer wenn ich in die Dateischreiben will macht der keine neue Zeile habs mit verschiedenen Lösungen schon versucht.