Проблемы Unicode с веб-страницами в urllib Python
Кажется, у меня есть знакомая проблема правильного чтения и просмотра веб-страницы. Похоже, что Python читает страницу в UTF-8, но когда я пытаюсь преобразовать ее в нечто более видимое (iso-8859-1), я получаю эту ошибку:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 2: ordinal not in range(128)
Код выглядит так:
#!/usr/bin/python
from urllib import urlopen
import re
url_address = 'http://www.eurohockey.net/players/show_player.cgi?serial=4722'
finished = 0
begin_record = 0
col = 0
str = ''
for line in urlopen(url_address):
if '</tr' in line:
begin_record = 0
print str
str = ''
continue
if begin_record == 1:
col = col + 1
tmp_match = re.search('<td>(.+)</td>', line.strip())
str = str + ';' + unicode(tmp_match.group(1), 'iso-8859-1')
if '<tr class=\"even\"' in line or '<tr class=\"odd\"' in line:
begin_record = 1
col = 0
continue
Как я должен обращаться с содержимым? Firefox, по крайней мере, считает, что это iso-8859-1, и было бы разумно взглянуть на содержимое этой страницы. Ошибка происходит от символа "ä" ясно.
И если бы я должен был сохранить эти данные в базе данных, я не должен беспокоиться о смене кодека и последующем преобразовании при его отображении?
3 ответа
Не похоже, что Python вообще "читает это в UTF-8". Как уже указывалось, у вас проблема с кодированием, а не проблема с декодированием. Невозможно, чтобы эта ошибка возникла из той строки, которую вы говорите. Задавая вопрос, подобный этому, всегда давайте полный ответ и сообщение об ошибке.
Подозрения Кэти верны; на самом деле print str
Строка - единственный возможный источник этой ошибки, и это может произойти, только если sys.stdout.encoding не установлен, поэтому Python запускает 'ascii'.
Переменные, которые могут повлиять на результат, - это то, какую версию Python вы используете, на какой платформе вы работаете и как именно вы запускаете свой скрипт - ни об одной из них вы нам не рассказали; пожалуйста, сделай.
Пример: я использую Python 2.6.2 в Windows XP и запускаю ваш скрипт с некоторыми диагностическими дополнениями:
(1) import sys; print sys.stdout.encoding
в передней части (2) print repr(str)
до print str
так что я могу видеть то, что у тебя есть до того, как оно рухнет
В окне командной строки, если я делаю \python26\python hockey.py
это печатает cp850
как кодировка так и работает.
Однако если я сделаю
\python26\python hockey.py | more
или же
\python26\python hockey.py >hockey.txt
это печатает None
как кодирование и вылетает с вашим сообщением об ошибке в первой строке с a-with-diaeresis:
C:\junk>\python26\python hockey.py >hockey.txt
Traceback (most recent call last):
File "hockey.py", line 18, in <module>
print str
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 2: ordinal not in range(128)
Если это соответствует вашему случаю, в общем случае исправление заключается в явном кодировании вашего вывода с помощью кодировки, подходящей для механизма отображения, который вы планируете использовать.
Как отметил Леннарт, ваша проблема не в расшифровке. Он пытается закодировать в "ascii", что часто является проблемой с print
заявления. Я подозреваю линию
print str
это твоя проблема. Вам нужно закодировать str во все, что использует ваша консоль, чтобы эта строка работала.
Этот текст действительно iso-88591-1, и я могу без проблем его декодировать, и действительно, ваш код работает без проблем.
Однако ваша ошибка - это ошибка ENCODE, а не ошибка декодирования. И вы не делаете никакой кодировки в своем коде, поэтому. Возможно, вы перепутали кодирование и декодирование, это общая проблема.
Вы ДЕКОДИТЕ с Latin1 на Unicode. Вы кодируете другой путь. Помните, что Latin1, UTF8 и т. Д. Называются "кодировками".