Python urllib, minidom y el análisis de caracteres internacionales
-
05-07-2019 - |
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?
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.