Domanda

Quando provo a recuperare informazioni dall'API meteorologica di Google con il seguente URL,

http://www.google.com/ig/api ? tempo = Monaco di Baviera, Germania & amp; hl = de

e quindi provo ad analizzarlo con minidom, ricevo l'errore che il documento non sia ben formato.

Uso il seguente codice

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

Penso che i caratteri tedeschi nella risposta siano la causa dell'errore.

Qual è il modo corretto di farlo?

È stato utile?

Soluzione

La codifica inviata nelle intestazioni è iso-8859-1 secondo urllib.urlopen di python (anche se le intestazioni http live di firefox sembrano non essere d'accordo con me in questo caso - riporta utf-8). Nel file xml stesso non è specificata alcuna codifica - > ecco perché xml.dom.minidom assume che sia utf-8.

Quindi, quanto segue dovrebbe risolvere questo specifico problema:

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'))

Modifica : ho aggiornato questa risposta dopo il commento di Glenn Maynard. Mi sono preso la libertà di togliere una riga dalla risposta di Lennert Regebro.

Altri suggerimenti

Questo sembra funzionare:

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'))

Immagino che minidom non gestisca nulla di non-ascii. Potresti voler esaminare lxml, invece.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top