Заменить специальные символы в питоне - PullRequest
3 голосов
/ 16 января 2011

У меня есть какой-то текст из Интернета:

£ 6,49

Очевидно, я бы хотел, чтобы это отображалось как:

£ 6,49

До сих пор я пробовал следующее:

s = url['title']
s = s.encode('utf8')
s = s.replace(u'Â','')

И несколько вариантов этого (после того, как я нашел его на этом же форуме)

Но все равно не повезло, так как я продолжаю получать:

UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xc3 в позиции 100: порядковый номер не находится в диапазоне (128)

Может ли кто-нибудь помочь мне понять это правильно?

ОБНОВЛЕНИЕ:

Добавление примеров repr и типа контента

u'Star Trek XI £3.99'
u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'
Content-Type: text/html; charset=utf-8

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 16 января 2011

Если s=url['title'] делает s равным этому:

In [48]: s=u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'

Тогда проблема в

  1. в коде, который определяет url,
  2. или контент из Интернета MAL сформированным.

В случае 1 нам нужно увидеть код, который определяет url.

В случае 2 быстрым и грязным обходным решением будет кодирование объекта Unicode s с помощью кодека raw-unicode-escape:

In [49]: print(s)
Oscar Winners Best Pictures Box Set £6.49

In [50]: print(s.encode('raw-unicode-escape'))
Oscar Winners Best Pictures Box Set £6.49

См. Также ТАК вопрос .


Относительно названий, таких как s=u'Star Trek XI £3.99': Опять же, было бы неплохо исправить проблему, прежде чем она перейдет к этому этапу - возможно, посмотрев, как определяется url. Но если предположить, что контент из Интернета имеет неправильную форму, обходной путь будет:

In [86]: import re

In [87]: print(re.sub(r'&#x([a-fA-F\d]+);',lambda m: unichr(int(m.group(1),base=16)),s))
Star Trek XI £3.99

Немного объяснения:

Обратите внимание, что

In [51]: x=u'£'
In [53]: x.encode('utf-8')
Out[53]: '\xc2\xa3'

Таким образом, объект Unicode u'£', закодированный кодеком utf-8, становится строковым объектом '\xc2\xa3'.

Каким-то образом url['title'] становится объектом Юникод . u'\xc2\xa3'. (u имеет большое значение!)

Таким образом, у нас есть u'\xc2\xa3', когда мы желаем '\xc2\xa3'. Кодирование объекта Unicode u'\xc2\xa3' с помощью кодека raw-unicode-escape преобразует его в '\xc2\xa3'.

0 голосов
/ 16 января 2011

Изменить: ваши объекты уже в Unicode.Мне кажется, нет никакой причины использовать enocde / decode вообще.

>>> print u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'.replace(u'Â','')
Oscar Winners Best Pictures Box Set £6.49

Однако мне кажется, что там что-то не так.Объекты Unicode на самом деле не являются Unicode;см .:

>>> print 'Oscar Winners Best Pictures Box Set \xc2\xa36.49'.decode('utf8')
Oscar Winners Best Pictures Box Set £6.49

Опубликованный вами repr () не должен быть объектом в кодировке Unicode.Вот почему я спрашивал, откуда вы берете данные, что-то не так.

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