2012-06-24 14 views
5

Necesito obtener todo el texto de una página usando BeautifulSoup. En la documentación de BeautifulSoup, mostró que puede hacer soup.get_text() para hacer esto. Cuando he intentado hacer esto en reddit.com, tengo este error:Use soup.get_text() con UTF-8


UnicodeEncodeError in soup.py:16 
    'cp932' codec can't encode character u'\xa0' in position 2262: illegal multibyte sequence 

recibo errores como que en la mayoría de los sitios que he marcado.
Obtuve errores similares cuando hice soup.prettify() también, pero lo arreglé cambiándolo a soup.prettify('UTF-8'). ¿Hay alguna forma de arreglar esto? ¡Gracias por adelantado!

de actualización cada 24 de junio de
he encontrado un poco de código que parece funcionar para otras personas, pero todavía tengo que usar UTF-8 en lugar del predeterminado. Código:


texts = soup.findAll(text=True) 

    def visible(element): 
     if element.parent.name in ['style', 'script', '[document]', 'head', 'title']: 
     return False 
     elif re.match('', str(element)): return False 
     elif re.match('\n', str(element)): return False 
     return True 

    visible_texts = filter(visible, texts) 

    print visible_texts 

error es diferente, sin embargo. ¿Progreso?


UnicodeEncodeError in soup.py:29 
'ascii' codec can't encode character u'\xbb' in position 1: ordinal not in range 
(128) 

Respuesta

0

No se puede hacer str (texto) si se trata de unicode en la página. En lugar de str(), usa unicode().

1

soup.get_text() devuelve una cadena Unicode por eso está obteniendo el error.

Puede resolverlo de varias formas, incluida la configuración de la codificación en el nivel del shell.

export PYTHONIOENCODING=UTF-8 

Puede volver a cargar sys y configurar la codificación incluyendo esto en su secuencia de comandos.

if __name__ == "__main__": 
    reload(sys) 
    sys.setdefaultencoding("utf-8") 

O puede codificar la cadena como utf-8 en el código. Para su problema de reddit algo así podría funcionar:

import urllib 
from bs4 import BeautifulSoup 

url = "https://www.reddit.com/r/python" 
html = urllib.urlopen(url).read() 
soup = BeautifulSoup(html) 

# get text 
text = soup.get_text() 

print(text.encode('utf-8'))