Вопрос

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

http://www.google.com/ig/api ? погода = Мюнхен, Германия & амп; гл = де

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

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

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

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

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

Это было полезно?

Решение

Кодировка, отправляемая в заголовках - iso-8859-1 в соответствии с urllib.urlopen, написанным на python (хотя в этом случае мне кажется, что live 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'))

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

Другие советы

Кажется, это работает:

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, так и есть.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top