Unicode проблемы с веб-страницами в urllib Python - PullRequest
1 голос
/ 29 июня 2009

Кажется, у меня есть знакомая проблема правильного чтения и просмотра веб-страницы. Похоже, что 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 ]

3 голосов
/ 29 июня 2009

Как отметил Леннарт, ваша проблема не в декодировании. Он пытается закодировать в «ascii», что часто является проблемой с print операторами. Я подозреваю, что линия

print str

это ваша проблема. Вам нужно закодировать str во все, что использует ваша консоль, чтобы эта строка работала.

2 голосов
/ 29 июня 2009

Не похоже, что 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)

Если это соответствует вашему случаю, в общем случае исправление заключается в явном кодировании вашего вывода с помощью кодировки, подходящей для механизма отображения, который вы планируете использовать.

1 голос
/ 29 июня 2009

Этот текст действительно iso-88591-1, и я могу декодировать его без проблем, и ваш код действительно работает без помех

Однако ваша ошибка - это ошибка ENCODE, а не ошибка декодирования. И вы не делаете никакой кодировки в своем коде, поэтому. Возможно, вы перепутали кодирование и декодирование, это общая проблема.

Вы ДЕКОДИРУЕТЕ с Latin1 на Unicode. Вы кодируете другой путь. Помните, что Latin1, UTF8 и т. Д. Называются «кодировками».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...