Python urllib, minidom e análise de caracteres internacionais
-
05-07-2019 - |
Pergunta
Quando tento recuperar informações do Google API tempo com o seguinte URL,
http://www.google.com/ig/api ? tempo = Munique, Alemanha & hl = de
e, em seguida, tentar analisá-lo com minidom, recebo erro que o documento não está bem formado.
Eu uso seguinte código
sock = urllib.urlopen(url) # above mentioned url
doc = minidom.parse(sock)
Eu acho que os personagens alemães na resposta é a causa do erro.
O que é a maneira correta de fazer isso?
Solução
A codificação enviada nos cabeçalhos é iso-8859-1 acordo com urllib.urlopen de python (embora do firefox ao vivo http cabeçalhos parece discordar de mim neste caso - relatórios utf-8). No próprio xml não há nenhuma codificação especificada -> é por isso que xml.dom.minidom assume-lo de utf-8.
Então, o seguinte deve corrigir esse 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 : Eu atualizei esta resposta depois do comentário de Glenn Maynard. Tomei a liberdade de tomar uma linha fora da resposta de Lennert Regebro.
Outras dicas
Isso 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'))
Eu acho que minidom não lidar com qualquer coisa não-ascii. Você pode querer olhar para lxml em vez disso, ele faz.