Python для показа специальных символов - PullRequest
4 голосов
/ 02 апреля 2012

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

Я пытаюсь напечатать строку, но при печати на ней не отображаются специальные символы (например, æ, ø, å, ö и ü). Когда я печатаю строку, используя repr(), я получаю следующее:

u'Von D\xc3\xbc' и u'\xc3\x96berg'

Кто-нибудь знает, как я могу преобразовать это в Von Dü и Öberg? Для меня важно, чтобы эти символы не игнорировались, например, myStr.encode("ascii", "ignore").

EDIT

Это код, который я использую. Я использую BeautifulSoup, чтобы очистить сайт. Содержимое ячейки (<td>) в таблице (<table>) помещается в переменную name. Это переменная, которая содержит специальные символы, которые я не могу напечатать.

web = urllib2.urlopen(url);
soup = BeautifulSoup(web)
tables = soup.find_all("table")
scene_tables = [2, 3, 6, 7, 10]
scene_index = 0
# Iterate over the <table>s we want to work with
for scene_table in scene_tables:
    i = 0
    # Iterate over < td> to find time and name
    for td in tables[scene_table].find_all("td"):
        if i % 2 == 0:  # td contains the time
            time = remove_whitespace(td.get_text())
        else:           # td contains the name
            name = remove_whitespace(td.get_text()) # This is the variable containing "nonsense"
            print "%s: %s" % (time, name,)
        i += 1
    scene_index += 1

Ответы [ 3 ]

7 голосов
/ 02 апреля 2012

Профилактика лучше лечения. Что вам нужно, это выяснить, как создается этот мусор. Пожалуйста, измените ваш вопрос, чтобы показать код, который его создает, и тогда мы сможем помочь вам исправить это. Похоже, кто-то сделал:

your_unicode_string =  original_utf8_encoded_bytestring.decode('latin1')

Лечение состоит в том, чтобы просто повернуть процесс вспять и затем декодировать.

correct_unicode_string = your_unicode_string.encode('latin1').decode('utf8')

Обновление Исходя из предоставленного вами кода, вероятной причиной является то, что веб-сайт заявляет, что он закодирован в ISO-8859-1 (он же latin1), но на самом деле он закодирован в UTF-8. , Пожалуйста, обновите ваш вопрос, чтобы показать нам URL.

Если вы не можете показать это, прочитайте Документы BS ; похоже, вам нужно использовать:

BeautifulSoup(web, from_encoding='utf8')
3 голосов
/ 02 апреля 2012

Поддержка Unicode во многих языках сбивает с толку, поэтому ваша ошибка здесь понятна.Эти строки представляют собой байты UTF-8, которые будут работать правильно, если вы уроните u спереди:

>>> err = u'\xc3\x96berg'
>>> print err
Ã?berg
>>> x = '\xc3\x96berg'
>>> print x
Öberg
>>> u = x.decode('utf-8')
>>> u
u'\xd6berg'
>>> print u
Öberg

. Для получения дополнительной информации:

http://www.joelonsoftware.com/articles/Unicode.html

http://docs.python.org/howto/unicode.html


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

def convert_fake_unicode_to_real_unicode(string):
    return ''.join(map(chr, map(ord, string))).decode('utf-8')
1 голос
/ 02 апреля 2012

Содержимое строк не в кодировке Unicode, оно в кодировке UTF-8.

>>> print u'Von D\xc3\xbc'
Von Dü
>>> print 'Von D\xc3\xbc'
Von Dü

>>> print unicode('Von D\xc3\xbc', 'utf-8')
Von Dü
>>> 

Редактировать:

>>> print '\xc3\x96berg' # no unicode identifier, works as expected because it's an UTF-8 encoded string
Öberg
>>> print u'\xc3\x96berg' # has unicode identifier, means print uses the unicode charset now, outputs weird stuff
Ãberg

# Look at the differing object types:
>>> type('\xc3\x96berg')
<type 'str'>
>>> type(u'\xc3\x96berg')
<type 'unicode'>

>>> '\xc3\x96berg'.decode('utf-8') # this command converts from UTF-8 to unicode, look at the unicode identifier in the output
u'\xd6berg'
>>> unicode('\xc3\x96berg', 'utf-8') # this does the same thing
u'\xd6berg'
>>> unicode(u'foo bar', 'utf-8') # trying to convert a unicode string to unicode will fail as expected
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: decoding Unicode is not supported
...