J'ai un script pour récupérer des données et les analyser via lxml.

Initialement, il a le type lxml.etree._ElementUnicodeResult, mais nous pourrions facilement le convertir unicode.

Il y a un moment périlleux. Cette chaîne unicode contient des octets bruts de chaîne. Bien que celui-ci ait le type unicode, il conserve les octets bruts de python habituel str.

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

Existe-t-il un moyen de convertir cette unicode chaîne d'octets bruts en octets bruts en fait (type str sur python 2).

Je pouvais facilement le copier-coller sur une console interactive et le convertir réellement en points 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
xiº 9 mars 2016 à 00:19

3 réponses

Meilleure réponse

Encodez la chaîne à l'aide de l'encodage "latin-1", qui mappe directement les 256 caractères U + 0000 à U + 00FF en octets simples.

>>> 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
dan04 9 mars 2016 à 00:23

Votre chaîne Unicode a été décodée avec le mauvais codec. Il ressemble à latin1. Vous pouvez le ré-encoder avec le même mauvais codec, puis le décoder avec le bon.

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

Production:

Владимир

Mieux encore, décodez-le correctement en premier lieu; ^)

1
Mark Tolonen 9 mars 2016 à 03:49

Est-ce que cela aide ?

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
Zubair Azami 8 mars 2016 à 22:47