2011-03-08 15 views
6

Esto es lo que hice ..python UnicodeEncodeError> ¿Cómo puedo simplemente eliminar molestos caracteres Unicode?

>>> 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> 
>>> 

¿Cómo puedo quitar simplemente los caracteres Unicode preocupantes desde html?
¿O hay alguna solución más limpia?

Respuesta

10

Trate de esta manera: soup = BeautifulSoup (html.decode('utf-8', 'ignore'))

+0

no funcionó! Aquí está lo que sucedió ... >>> html.decode ('utf-8', 'strip') Traceback (última llamada más reciente): ..... LookupError: desconocido nombre del manejador de errores 'strip' >>> >>> html.decode ('utf-8') Traceback (llamada más reciente): ..... UnicodeDecodeError: el códec 'utf8' no puede decodificar byte 0xae en posición 98071: byte de código inesperado > >> – Nullpoet

+1

Lo siento mucho, 'ignorar' en lugar de 'pelar'. También recomiendo leer el CÓMO Unicode http://docs.python.org/howto/unicode.html – esv

1

En primer lugar, los caracteres Unicode "preocupantes" podrían ser letras en algún idioma, pero suponiendo que no tendrá que preocuparse por caracteres no ingleses, entonces puede usar una lib de Python para convertir unicode en ansi. Vea la respuesta a esta pregunta: How do I convert a file's format from Unicode to ASCII using Python?

La respuesta aceptada parece ser una buena solución (que no sabía de antemano).

+0

Esa solución no está funcionando para mí como html no es Unicode, es sólo str [>>> unicodedata.normalize ('NFKD', html) .encode ('ascii', 'ignorar') Rastreo (llamada más reciente pasado): archivo "", línea 1, en TypeError: Normalizar() 2 argumento debe ser unicode, no str] – Nullpoet

2

El error que se ve es debido a repr(soup) intentos de mezclar Unicode y cadenas de bytes. Mezclar Unicode y cadenas de bytes con frecuencia conduce a errores.

Compare:

>>> 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) 

Y:

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

He aquí un ejemplo para las clases:

>>> 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) 

Algo similar sucede con 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) 

Para solucionar es:

>>> unicode(soup) 
u'<p>\xa9</p>' 
>>> str(soup) 
'<p>\xc2\xa9</p>' 
>>> soup.encode('utf-8') 
'<p>\xc2\xa9</p>' 
Cuestiones relacionadas