Конвертировать юникод со строкой utf-8 в качестве содержимого в str

Я использую pyquery для анализа страницы:

dom = PyQuery('http://zh.wikipedia.org/w/index.php', {'title': 'CSS', 'printable': 'yes', 'variant': 'zh-cn'})
content = dom('#mw-content-text > p').eq(0).text()

но что я получаю в content строка в кодировке Unicode с содержимым в кодировке utf-8:

u'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8...'

как я мог преобразовать это в str без потери контента?

чтобы было понятно:

я хочу conent == '\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'

не conent == u'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'

1 ответ

Решение

Если у тебя есть unicode значение с байтами UTF-8, закодировать в Latin-1, чтобы сохранить "байты":

content = content.encode('latin1')

потому что кодовые точки Unicode от U+0000 до U+00FF все отображаются один на один с кодировкой latin-1; таким образом, эта кодировка интерпретирует ваши данные как буквенные байты.

Для вашего примера это дает мне:

>>> content = u'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'
>>> content.encode('latin1')
'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'
>>> content.encode('latin1').decode('utf8')
u'\u5c42\u53e0\u6837\u5f0f\u8868'
>>> print content.encode('latin1').decode('utf8')
层叠样式表

PyQuery использует либо requests или же urllib чтобы получить HTML, а в случае requests, использует .text атрибут ответа. Это автоматически декодирует данные ответа на основе кодирования, установленного в Content-Type заголовок или, если эта информация недоступна, использует latin-1 для этого (для текстовых ответов, но HTML является текстовым ответом). Вы можете изменить это, передав encoding аргумент:

dom = PyQuery('http://zh.wikipedia.org/w/index.php', encoding='utf8',
              {'title': 'CSS', 'printable': 'yes', 'variant': 'zh-cn'})

в этот момент вам не придется перекодировать вообще.

Другие вопросы по тегам