Python urllib, минидом и парсинг международных символов
-
05-07-2019 - |
Вопрос
Когда я пытаюсь получить информацию из 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, так и есть.