Python urllib, minidom et analyse des caractères internationaux
-
05-07-2019 - |
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?
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.