BeautifulSoup4 stripped_strings me da los objetos byte?

Estoy tratando de sacar el texto de un blockquote que se ve así:

01 Oyasumi

02 DanSin'

03 wts

04 Lovism

05 NoName

06 Gakkou

07 Happy☆Day

08 Endless End.

Lo que estoy tratando de hacer es esto en Python 2.7 (no puede decodificar el carácter ☆, por lo que traté de usar encoding):

 soup = BeautifulSoup(r.text, "html5lib") #r is from a requests get request content = soup.find("blockquote", {"class": "postcontent restre "}).stripped_strings for line in content: print(line.encode("utf-8")) 

Y esto es lo que obtengo:

 b'01 Oyasumi' b"02 DanSin'" b'03 wts' b'04 Lovism' b'05 NoName' b'06 Gakkou' b'07 Happy\xe2\x98\x86Day' b'08 Endless End.' 

¿Qué estoy haciendo mal?

El problema es que Beautiful Soup convierte la encoding original a Unicode si no se especifica from_encoding mediante una sub-biblioteca llamada Unicode, Dammit . Más información en la sección de Codificaciones en la documentación.

 >>> from bs4 import BeautifulSoup >>> doc = '''
... 01 Oyasumi ...
... 02 DanSin' ...
... 03 wts ...
... 04 Lovism ...
... 05 NoName ...
... 06 Gakkou ...
... 07 Happy☆Day ...
... 08 Endless End. ...
''' >>> soup = BeautifulSoup(doc, 'html5lib') >>> soup.original_encoding u'windows-1252' >>> content = soup.find("blockquote", {"class": "postcontent restre "}).stripped_strings >>> for line in content: ... print(line) ... 01 Oyasumi 02 DanSin' 03 wts 04 Lovism 05 NoName 06 Gakkou 07 Happy☆Day 08 Endless End.

Para arreglar esto tienes dos opciones:

  1. Al pasar el parámetro from_encoding correcto o excluir el error, la encoding incorrecta Dammit es adivinar. Un problema es que no todos los analizadores admiten el argumento exclude_encodings . Por ejemplo, el html5lib árbol html5lib no admite exclude_encoding

     >>> soup = BeautifulSoup(doc, 'html5lib', from_encoding='utf-8') >>> content = soup.find("blockquote", {"class": "postcontent restre "}).stripped_strings >>> for line in content: ... print(line) ... 01 Oyasumi 02 DanSin' 03 wts 04 Lovism 05 NoName 06 Gakkou 07 Happy☆Day 08 Endless End. >>> 
  2. Usa el analizador lxml

     >>> soup = BS(doc, 'lxml') >>> soup.original_encoding 'utf-8' >>> content = soup.find("blockquote", {"class": "postcontent restre "}).stripped_strings >>> for line in content: ... print(line) ... 01 Oyasumi 02 DanSin' 03 wts 04 Lovism 05 NoName 06 Gakkou 07 Happy☆Day 08 Endless End.