Frage

Wenn ich versuche, Informationen von Google Wetter API mit der folgenden URL abrufen,

http://www.google.com/ig/api ? Wetter = München, Deutschland & hl = de

und dann versuchen, es mit minidom zu analysieren, ich Fehlermeldung erhalten, dass das Dokument nicht gut ausgebildet ist.

Ich verwende folgenden Code

sock = urllib.urlopen(url) # above mentioned url
doc = minidom.parse(sock)

Ich denke, die deutschen Zeichen in der Antwort die Ursache des Fehlers ist.

Was ist der richtige Weg, dies zu tun?

War es hilfreich?

Lösung

Die Codierung in dem Header gesendet wird iso-8859-1 nach Pythons urllib.urlopen (obwohl Firefox Live-HTTP-Header mit mir in diesem Fall zu widersprechen scheinen - Berichte utf-8). In der XML selbst gibt es keine Codierung angegeben -> das ist, warum xml.dom.minidom utf-8 ist es annimmt.

So sollte folgende dieses spezielle Problem beheben:

import urllib
from xml.dom import minidom

sock = urllib.urlopen('http://www.google.com/ig/api?weather=Munich,Germany&hl=de')
s = sock.read()
encoding = sock.headers['Content-type'].split('charset=')[1] # iso-8859-1
doc = minidom.parseString(s.decode(encoding).encode('utf-8'))

Bearbeiten : ich diese Antwort nach dem Kommentar von Glenn Maynard aktualisiert haben. Ich habe die Freiheit, eine Zeile aus der Antwort von Lennert Regebro nehmen.

Andere Tipps

Dies scheint zu funktionieren:

sock = urllib.urlopen(url)
# There is a nicer way for this, but I don't remember right now:
encoding = sock.headers['Content-type'].split('charset=')[1]
data = sock.read()
dom = minidom.parseString(data.decode(encoding).encode('ascii', 'xmlcharrefreplace'))

Ich denke, minidom behandelt nicht alles Nicht-ascii. Sie könnten in lxml aussehen wollen stattdessen, es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top