Получение юникода из запроса urllib - PullRequest
2 голосов
/ 13 августа 2011

Я запускаю следующий код, пытаясь найти конкретную информацию в некотором HTML. Однако у меня проблема с кодированием / декодированием, которую я не могу решить.

import urllib
req = urllib.urlopen('http://securities.stanford.edu/1046/AAI00_01/')
html = req.read()
type(html)
#   <type 'str'>
html.upper().find('HTML')
#   -1
print html[0:20]
#   ??<HTML><HE
html[0:10]
#   '\xff\xfe<\x00H\x00T\x00M\x00'
req.headers['content-type']
#   'text/html'
html = html.encode('utf-8')
#   Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)

Каково решение этой проблемы? Все, что мне нужно сделать, это собрать некоторую информацию со страницы, используя .find и регулярные выражения.

Я использую Mac OSX и запускаю Python 2.6.1 из терминала.

1 Ответ

1 голос
/ 13 августа 2011

Если вы пытаетесь конвертировать из str у вас в unicode, вы хотите использовать html.decode, а не encode.

Старый, плохой совет: Кроме того, поскольку у вас там, похоже, есть спецификация в начале, вы, вероятно, захотите использовать 'utf_8_sig' в качестве кодировки, что приведет к удалению спецификации при декодировании..

Новый, лучший совет: На самом деле, при просмотре всех этих \x00 в выходных данных вместе с спецификацией, похоже, что кодировка на самом деле является UTF-16, а неUTF-8.Так что, html.decode('utf-16') должен быть путь.

...