python UnicodeEncodeError> Как я могу просто удалить тревожные символы Юникода? - PullRequest
6 голосов
/ 08 марта 2011

Вот что я сделал ..

>>> soup = BeautifulSoup (html)
>>> soup
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 96953: ordinal not in range(128)
>>> 
>>> soup.find('div')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 11035: ordinal not in range(128)
>>> 
>>> soup.find('span')
<span id="navLogoPrimary" class="navSprite"><span>amazon.com</span></span>
>>> 

Как я могу просто удалить тревожные символы Юникода из html?
Или есть более чистое решение?

Ответы [ 4 ]

10 голосов
/ 08 марта 2011

Попробуйте так: soup = BeautifulSoup (html.decode('utf-8', 'ignore'))

2 голосов
/ 09 марта 2011

Ошибка, которую вы видите из-за repr(soup) попытки смешать Юникод и строки байтов.Смешивание Unicode и bytestrings часто приводит к ошибкам.

Сравнение:

>>> u'1' + '©'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)

И:

>>> u'1' + u'©'
u'1\xa9'
>>> '1' + u'©'
u'1\xa9'
>>> '1' + '©'
'1\xc2\xa9'

Вот пример для классов:

>>> class A:
...     def __repr__(self):
...         return u'copyright ©'.encode('utf-8')
... 
>>> A()
copyright ©
>>> class B:
...     def __repr__(self):
...         return u'copyright ©'
... 
>>> B()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 10: ordi
nal not in range(128) #' workaround highlighting bug
>>> class C:
...     def __repr__(self):
...         return repr(A()) + repr(B())
...
>>> C()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 3, in __repr__
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 10: ordi
nal not in range(128)

То же самое происходит с BeautifulSoup:

>>> html = """<p>©"""
>>> soup = BeautifulSoup(html)
>>> repr(soup)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 3: ordin
al not in range(128)

Чтобы обойти это:

>>> unicode(soup)
u'<p>\xa9</p>'
>>> str(soup)
'<p>\xc2\xa9</p>'
>>> soup.encode('utf-8')
'<p>\xc2\xa9</p>'
1 голос
/ 08 марта 2011

Прежде всего, «тревожные» символы юникода могут быть буквами на каком-то языке, но если вам не придется беспокоиться о неанглийских символах, тогда вы можете использовать библиотеку python для преобразования юникода в ansi. Проверьте ответ на этот вопрос: Как мне преобразовать формат файла из Unicode в ASCII, используя Python?

Принятый ответ кажется хорошим решением (о котором я раньше не знал).

0 голосов
/ 03 января 2012

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

UnicodeEncodeError с BeautifulSoup 3.1.0.1 и Python 2.5.2

...