Question

Lorsque j'essaie de récupérer des informations de l'API météo de Google avec l'URL suivante,

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

et essayez ensuite de l'analyser avec minidom, je reçois une erreur selon laquelle le document n'est pas bien formé.

J'utilise le code suivant

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

Je pense que les caractères allemands de la réponse sont la cause de l'erreur.

Quelle est la bonne façon de faire cela?

Était-ce utile?

La solution

Le codage envoyé dans les en-têtes est iso-8859-1 selon urllib.urlopen de python (bien que les en-têtes http de firefox semblent en désaccord avec moi dans ce cas - rapporte utf-8). Dans le XML même, aucun codage n'est spécifié - > C'est pourquoi xml.dom.minidom suppose que c'est utf-8.

Les éléments suivants devraient donc résoudre ce problème spécifique:

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

Modifier : j'ai mis à jour cette réponse après le commentaire de Glenn Maynard. J'ai pris la liberté de prendre une ligne de la réponse de Lennert Regebro.

Autres conseils

Cela semble fonctionner:

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

Je suppose que minidom ne gère rien d’autre que l’asci. Vous voudrez peut-être regarder dans lxml à la place, c'est le cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top