Python urllib, минидом и разбор международных символов - PullRequest
0 голосов
/ 11 сентября 2009

Когда я пытаюсь получить информацию из API погоды Google по следующему URL,

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

, а затем попробуйте разобрать его с помощью minidom, я получаю сообщение об ошибке, что документ неправильно сформирован.

Я использую следующий код

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

Я думаю, что немецкие символы в ответе являются причиной ошибки.

Как правильно это сделать?

Ответы [ 2 ]

2 голосов
/ 11 сентября 2009

Это похоже на работу:

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

Полагаю, minidom не обрабатывает ничего, кроме ascii. Возможно, вы захотите вместо этого взглянуть на lxml.

1 голос
/ 11 сентября 2009

Кодировка, отправляемая в заголовках, iso-8859-1 в соответствии с urllib.urlopen, написанным на python (хотя живые http-заголовки firefox в этом случае, похоже, не согласны со мной - сообщает utf-8). В самом xml не указана кодировка -> поэтому xml.dom.minidom предполагает, что это utf-8.

Таким образом, следующее должно решить эту конкретную проблему:

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

Редактировать : Я обновил этот ответ после комментария Гленна Мейнарда. Я позволил себе взять одну строчку из ответа Леннерта Регебро.

...