mehrere zeichen ersetzen in einem Text dokument

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo Forum,

ich hole mir gerade die Wetterdaten von folgender Website:
http://www.webservicex.net/globalweather.asmx
was auch sehr gut funktioniert, allerdings werden diese "<", ">" Tags
wie folgt dargestellt: ">", "<" nun habe ich mein Programm so angepasst, dass dieses einfach ersetzt werden.
meine frage ist nun, ob ich dieses auch eleganter machen kann?

vielen Dank im voraus

Code: Alles auswählen

weatherdata = requests.get('http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=Hamburg&CountryName=Germany')
print weatherdata.text
datei = open("wetter.xml", "w")
datei.write(weatherdata.text)
datei.close()

f1 = open('wetter.xml', 'r')
f2 = open('wetter_l.xml', 'w')
for line in f1:
    f2.write(line.replace('<', '<'))
f1.close()
f2.close()

f1 = open('wetter_l.xml', 'r')
f2 = open('wetter_g.xml', 'w')
for line in f1:
    f2.write(line.replace('>', '>'))
f1.close()
f2.close()
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

XML wie Textdateien zu behandeln ist keine so grandiose Idee. Es stellt sich so oder so die Frage, warum du den Text abspeicherst und ihn dann wieder liest. Das ist doch unsinnig. Kleiner Tipp am Rande, der dir bestimmt schon häufig gegeben wurde: benutze das with-Statement zum Öffnen von Dateien.

Nun aber zur Lösung deines Problems: Parse die Daten mit einem zur Verarbeitung von XML gedachtem Modul. Zum Beispiel lxml. Dann kommst du auch viel leichter an die Daten ran und musst nicht hoffen, dass die Dateien irgendwann mal nur leicht anders aussehen.
Das Leben ist wie ein Tennisball.
BlackJack

@erdmulch: Ergänzend zu EyDu: Das ist ein XML-Dokument welches als Zeichenkette XML kodiert ist. Das heisst Du musst zweimal Parsen, erst die Rückgabe um die Zeichenkette zu bekommen die ihrerseits noch mal als XML-Dokument geparst werden muss.
BlackJack

Diese dämliche API mit dem verpacken eines serialisierten XML-Dokuments *in* einem XML-Dokument weist ein interessantes Problem auf: serialisierte XML-Dokumente sind Bytes, der Wert aus dem umgebenden XML-Dokument ist aber eine Zeichenkette (Unicode). Das Problem tritt zu Tage wenn dieses verpackte XML-Dokument eine XML-Deklaration mit einer Kodierungsangabe hat, die ja auf eine Unicodezeichenkette nicht anwendbar ist. Im Fall dieser API steht da UTF-16 als Kodierung drin. Man muss also entweder die XML-Deklaration parsen und die Zeichenkette entsprechend kodieren bevor man sie einem XML-Parser geben kann, oder die XML-Deklaration entfernen, oder zumindest die Angabe der Kodierung.

Die beiden SOAP-Schnittstellen von dem Dienst weisen übrigens das selbe Problem auf.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@BlackJack: zumindest bei ElementTree kann man beim XMLParser ein encoding angeben, das das Encoding in der "Datei" überschreibt.

Code: Alles auswählen

import xml.etree.ElementTree as ET
document = ET.parse(StringIO.StringIO(text.encode('utf-8')), ET.XMLParser(encoding='utf-8'))
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das ist ja mal ein "spannendes" Format. Wie kommt man auf so eine Idee? Mir fällt im besten Willen nicht ein, was daran nun sinnvoll sein soll. Außer man mag seine Kollegen und Menschen im Allgemeinen nicht, dann ist das Format gut.
Das Leben ist wie ein Tennisball.
BlackJack

@EyDu: Man hat ein Programm bei dem XML rausfällt und sagt dem Praktikanten er solle das über eine SOAP-API ausliefern. Wahrscheinlich hat der das ersetzen der '<' und '>' im eingebetteten XML-Dokument in PHP mit Zeichenkettenoperarionen selbst gebastelt. Viele andere Erklärungsmöglichkeiten fallen mir da sonst spontan auch nicht ein. :twisted:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@BlackJack: Das war jetzt böse. Ich hätte ja zumindest erwartet, dass der Praktikant noch eine entsprechende DTD dazu ausliefert.

Code: Alles auswählen

<!DOCTYPE trainee_api>
:twisted:
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

So selten ist das gar nicht, dass man XML-Daten als String in SOAP-Pakete packt. DOTNET scheint das wohl automatisch schön zu serialisieren. Jedenfalls hatte ich so einen Fall auch schon mal.
Antworten