2016-03-08 30 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