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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top