Python urllib, minidom und Analysieren von internationalen Zeichen
-
05-07-2019 - |
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?
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.