Pregunta

Cuando intento recuperar información de la API meteorológica de Google con la siguiente URL,

http://www.google.com/ig/api ? weather = Munich, Alemania & amp; hl = de

y luego tratar de analizarlo con minidom, me da un error que el documento no está bien formado.

Uso el siguiente código

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

Creo que los caracteres alemanes en la respuesta son la causa del error.

¿Cuál es la forma correcta de hacer esto?

¿Fue útil?

Solución

La codificación enviada en los encabezados es iso-8859-1 de acuerdo con urllib.urlopen de python (aunque los encabezados http activos de Firefox parecen estar en desacuerdo conmigo en este caso, informa utf-8). En el mismo xml no hay ninguna codificación especificada - > por eso xml.dom.minidom asume que es utf-8.

Por lo tanto, lo siguiente debería solucionar este problema específico:

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

Editar : he actualizado esta respuesta después del comentario de Glenn Maynard. Me tomé la libertad de sacar una línea de la respuesta de Lennert Regebro.

Otros consejos

Esto parece funcionar:

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

Supongo que el minidom no maneja nada que no sea ascii. Es posible que desee ver en lxml, lo hace.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top