2016-03-08 2 views
0

У меня есть сценарий с извлечением некоторых данных и разбор его через lxml.Декодирование строки «raw», преобразованной в unicode

Первоначально он имеет тип lxml.etree._ElementUnicodeResult, но мы могли бы легко преобразовать его в unicode.

Существует некоторый опасный момент. Эта строка в Юникоде содержит необработанные байты строки. Хотя он имеет тип unicode, он хранит необработанные байты обычного python str.

label 
Out[53]: u'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80' 

Есть ли способ, чтобы преобразовать эту строку unicode необработанных байтов для необработанных байтов, фактически (str типа на Python 2).

Я мог бы легко скопировать и вставить его в интерактивной консоли и преобразовать его фактически Юникода пунктов:

'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80' 
Out[54]: '\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80' 

'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80'.decode('utf-8') 
Out[55]: u'\u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440' 
+0

Там должна быть ошибка в коде, если 'label' заканчивается имея это значение. Покажите фактический код, который его производит. – ekhumoro

ответ

1

Encode строка, используя «Latin-1» кодирование, которое прямолинейно отображает 256 символов U + 0000 через U + 00FF до побайтных.

>>> s = u'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80' 
>>> s.encode('latin-1') 
b'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80' 
-1

ли эта помощь?

str1 = repr(u'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80') 
print type(str1) 
print str1 
# or 
print str1[1:] 
1

Ваша строка в Юникоде была декодирована с неправильным кодеком. Это выглядит как latin1. Вы можете перекодировать его с тем же неправильным кодеком, а затем декодировать с правильным.

s = u'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80' 
print(s.encode('latin1').decode('utf8')) 

Выход:

Владимир 

еще лучше, расшифровать его правильно в первую очередь; ^)

+0

Строго говоря, это выглядит как закодированная байтовая строка utf-8 с 'u', застрявшим спереди. Или latin1 mojibake. – ekhumoro

+0

Это UTF-8. 'Владимир' является русским для' Владимир'. –

+0

Да, точно. Я просто шутил (и педантично), указывая, что он не «похож на latin1» (так как «Владимир» не может быть закодирован на латинском языке1). – ekhumoro