2016-03-08 52 views
0

我有腳本獲取一些數據並通過lxml解析它。解碼'原始'字符串轉換爲unicode

最初它有lxml.etree._ElementUnicodeResult類型,但我們可以很容易地將其轉換爲unicode

有一些危險的時刻。 此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類型的蟒蛇2)。

我可以很容易地將其複製並粘貼到交互式控制檯,實際上將其轉換爲Unicode點:

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

編碼使用「Latin-1的」編碼,這通過直截了當U + 00FF的256個字符U + 0000映射到單個字節的字符串。

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

您的Unicode字符串被錯誤的編解碼器解碼。它看起來像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。 'Владимир'是俄語'Vladimir'。 –

+0

是的,確切地說。我只是開玩笑地(並且迂腐地)指出它不是「看起來像latin1」(因爲'Владимир'不能用latin1編碼)。 – ekhumoro