Seite 1 von 1

mehrere zeichen ersetzen in einem Text dokument

Verfasst: Samstag 21. Februar 2015, 21:23
von erdmulch
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()

Re: mehrere zeichen ersetzen in einem Text dokument

Verfasst: Samstag 21. Februar 2015, 21:49
von EyDu
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.

Re: mehrere zeichen ersetzen in einem Text dokument

Verfasst: Samstag 21. Februar 2015, 22:00
von 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.

Re: mehrere zeichen ersetzen in einem Text dokument

Verfasst: Sonntag 22. Februar 2015, 20:33
von 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.

Re: mehrere zeichen ersetzen in einem Text dokument

Verfasst: Sonntag 22. Februar 2015, 20:54
von Sirius3
@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'))

Re: mehrere zeichen ersetzen in einem Text dokument

Verfasst: Sonntag 22. Februar 2015, 23:44
von EyDu
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.

Re: mehrere zeichen ersetzen in einem Text dokument

Verfasst: Montag 23. Februar 2015, 00:28
von 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:

Re: mehrere zeichen ersetzen in einem Text dokument

Verfasst: Montag 23. Februar 2015, 00:39
von EyDu
@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:

Re: mehrere zeichen ersetzen in einem Text dokument

Verfasst: Montag 23. Februar 2015, 07:41
von Sirius3
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.