2017-01-31 16 views
1

У меня есть кусок кода Python 2.7, который возвращает веб-страницу, закодированную в UTF-8. Это по существу делает это:Юникодские кириллические строки в Python 2.7

arequest=urllib2.urlopen(request.httprequest.host_url[:-1]+record.path) 
    response=arequest.read() 
    parser = etree.HTMLParser() 
    tree = etree.fromstring(response, parser) 

Я затем вытягивать информацию тега из дерева:

imgtags=map(lambda x: {'template_tag':False,'tag_type':'img','page_id':record.id,'src_value':x.attrib.get("src",""),'seo_a_title_text': x.attrib.get("title",""),'seo_text': x.attrib.get("alt","")}, tree.findall(".//img")) 

Проблема заключается в том, что полученный код возвращает это где такие элементы, как seo_a_title_text кодируются с \xd0 и не \u0428, что мне нужно:

[{'seo_a_title_text': u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b ', 'src_value': '/logo.png', 'seo_text': u'Logo of \xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b ', 'template_tag': False, 'page_id': 150, 'tag_type': 'img'}] 

кириллица строка «Штаты», и мне нужно сотрудничать nvert, что \xd0 и т. д. в \u0428\u0442\u0430\u0442\u044b для успешной смены базы данных, в противном случае он выглядит как «Ð¨ÑÐ ° ÑÑ», когда я читаю его снова.

Как получить строки, похожие на \u и т. Д., А не \x и т. Д.? Мне, должно быть, что-то не хватает, но я часами цепляюсь в Интернете и в консоли, пытаясь заставить его работать.

Примечание стороны, в верхней части файла имеет этот комментарий:

# -*- coding: utf-8 -*- 

Не уверен, если это будет влиять на ответы?

+1

Подобно тому, как намек к ответу, ' '\ xd0 \ xa8 \ xd1 \ x82 \ xd0 \ XB0 \ xd1 \ x82 \ xd1 \ x8b' .decode ("utf8") == u '\ u0428 \ u0442 \ u0430 \ u0442 \ u044b''. – Phillip

+1

Side-note: почти все, что связано с текстом, отличным от ASCII, лучше в Python 3. Если ничего другого, то факт, что только 'str' имеет' encode' и только 'bytes', имеет' decode' методы и ни молча конвертирует в другой затрудняет ошибки. Я бы сильно подумал о переключении. – ShadowRanger

+0

"\ xd0 \ xa8 \ xd1 \ x82 \ xd0 \ xb0 \ xd1 \ x82 \ xd1 \ x8b" .decode ("utf8") превращается в ошибку UnicodeEncodeError: кодек 'charmap' не может кодировать символы в позиции 0-4 : character maps to Mike

ответ

-1
var = [{'seo_a_title_text': u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b ', 'src_value': '/logo.png', 'seo_text': u'Logo of \xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b ', 'template_tag': False, 'page_id': 150, 'tag_type': 'img'}] 
print var[0]['seo_a_title_text'] 
+1

Это не отвечает на вопрос? Я могу легко получить строку, но хочу получить строку в другой кодировке. он должен появиться как \ u0428 \ u0442 \ u0430 \ u0442 \ u044b. – Mike

+0

Должен сделать класс с __str __() –

+0

, так что в python, как мне получить var [0] ['seo_a_title_text'] out как '\ u0428 \ u0442 \ u0430 \ u0442 \ u044b' NOT '\ xd0 \ xa8 \ xd1 \ x82 \ xd0 \ xb0 \ xd1 \ x82 \ xd1 \ x8b '- Или еще лучше сделать это преобразование в самом лямбда-коде – Mike

2

Эта \xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b строка является utf8 представление Штаты.

utf8 кодирует символы, используя один или несколько байт, так что, например: Ш (который имеет позицию 0x0428 в таблице Unicode, будет закодирован в качестве utf8 \xd0\xa8).

Теперь сложная часть, вы получаете строку utf8 как строку юникода. Вам необходимо преобразовать его в байты, прежде чем применять utf8 правильно. Один трюк - использовать ISO 8859-1 (aka Latin-1), потому что он отображает первые 256 кодов Unicode в их байтовые значения.

>>> u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b' 
'ШÑ\x82аÑ\x82Ñ\x8b' 
>>> u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b'.encode('latin1') 
b'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b' 
>>> u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b'.encode('latin1').decode('utf8') 
'Штаты' 

Примечание: Как указано Брюно, анализатор может быть сконфигурирован с правильной кодировкой непосредственно. Что бы избежать такого рода грязного кодирования Jüngling ...

+1

Более простым решением является указание 'lxml.HTMLParser', который кодирует содержимое html, который должен быть закодирован в

+0

Да! Я добавил к этому заметку. Спасибо – Cyrbil