BeautifulSoup4 stripped_strings дает мне байтовые объекты?

Я пытаюсь получить текст из блока, который выглядит так:

<blockquote class="postcontent restore "> 01 Oyasumi <br></br> 02 DanSin' <br></br> 03 wts <br></br> 04 Lovism <br></br> 05 NoName <br></br> 06 Gakkou <br></br> 07 Happy☆Day <br></br> 08 Endless End. </blockquote> 

Я пытаюсь сделать это в python 2.7 (он не может декодировать символ ☆, поэтому я попытался использовать кодировку):

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

И это то, что я получаю:

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

Что я делаю не так?

  • Как декодировать необработанные литералы Unicode для читаемой строки?
  • Преобразование кодировки unicode в UTF8 hex в python
  • Сохранение текстов utf-8 в json.dumps как UTF8, а не как \ u escape-последовательность
  • NameError: глобальное имя 'unicode' не определено - в Python 3
  • Кодек UCS-2 не может кодировать символы в позиции 1050-1050
  • Регулярные выражения и Unicode в Python: разница между sub и findall
  • Как декодировать JSON для str, а не unicode в Python (2.6)?
  • Python - кодек ascii не может декодировать байт
  • One Solution collect form web for “BeautifulSoup4 stripped_strings дает мне байтовые объекты?”

    Проблема в том, что Beautiful Soup преобразует исходную кодировку в Unicode, если from_encoding не указан с помощью from_encoding Unicode, Dammit . Дополнительная информация в разделе « Кодировки » в документации.

     >>> from bs4 import BeautifulSoup >>> doc = '''<blockquote class="postcontent restore "> ... 01 Oyasumi ... <br></br> ... 02 DanSin' ... <br></br> ... 03 wts ... <br></br> ... 04 Lovism ... <br></br> ... 05 NoName ... <br></br> ... 06 Gakkou ... <br></br> ... 07 Happy☆Day ... <br></br> ... 08 Endless End. ... </blockquote>''' >>> soup = BeautifulSoup(doc, 'html5lib') >>> soup.original_encoding u'windows-1252' >>> content = soup.find("blockquote", {"class": "postcontent restore "}).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. 

    Чтобы исправить это, у вас есть два варианта:

    1. Переходя в правильном параметре from_encoding или исключая неправильное неправильное кодирование, Dammit гадает. Одна из проблем заключается в том, что не все Parsers поддерживают аргумент exclude_encodings . Например, html5lib tree builder не поддерживает exclude_encoding

       >>> soup = BeautifulSoup(doc, 'html5lib', from_encoding='utf-8') >>> content = soup.find("blockquote", {"class": "postcontent restore "}).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. Использование анализатора lxml

       >>> soup = BS(doc, 'lxml') >>> soup.original_encoding 'utf-8' >>> content = soup.find("blockquote", {"class": "postcontent restore "}).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. 
    Python - лучший язык программирования в мире.