2017-01-04 3 views
0

J'ai mis au rebut une page Web avec BeautifulSoup. Je obtenu une grande sortie à l'exception des parties de l'apparence de la liste comme celui-ci après avoir reçu le texte:Python - Unicode et double-barre oblique inverse

list = [u'that\\u2019s', u'it\\u2019ll', u'It\\u2019s', u'don\\u2019t', u'That\\u2019s', u'we\\u2019re', u'\\u2013'] 

Ma question est de savoir comment se débarrasser ou remplacer ces doubles antislashs avec les caractères spéciaux qu'ils sont.

Si j'imprime le premier le premier élément de l'exemple liste la sortie ressemble

print list[0] 
that\u2019s 

J'ai déjà lu beaucoup d'autres questions/discussions sur ce sujet mais je fini par être encore plus confus, comme Je suis un débutant en considérant unicode/encodage/décodage.

J'espère que quelqu'un pourrait m'aider avec ce problème.

Merci! MG

+0

@mgruber se rappeler d'accepter une réponse si elle vous a aidé – eLRuLL

+0

À moins que la page Web ne contienne littéralement des séquences d'échappement unicode comme celle-ci (* that \ u2019s * au lieu de * that *), beautifulsoup ne retournera pas de chaînes sous cette forme. Il retournera le texte sans rien échapper. Comment obtenez-vous ces chaînes? – roeland

+0

J'ai effectué une regex dans le même temps et il semble que c'était le problème. Avez-vous des explications ad hoc pour cela? – mgruber

Répondre

2

le problème est que le site a fini par assurer un double codage ces arguments unicode, il suffit de ce qui suit:

ls = [u'that\\u2019s', u'it\\u2019ll', u'It\\u2019s', u'don\\u2019t', u'That\\u2019s', u'we\\u2019re', u'\\u2013'] 

ls = map(lambda x: x.decode('unicode-escape'), ls) 

maintenant vous avez une liste avec des chaînes correctement UNICODE codées:

for a in ls: 
    print a 
+0

J'ai d'abord essayé votre solution sur toute ma liste et cela n'a pas fonctionné. Ensuite, j'ai copié vos 4 lignes de code dans un script et essayé de l'exécuter et il a jeté l'erreur suivante: 'UnicodeEncodeError: 'codec' charmap 'ne peut pas encoder le caractère' 'en position 4: cartes de caractères à ' – mgruber

+0

vous devrait inclure votre exemple complet afin de mieux comprendre votre question.Cette nouvelle erreur se produit parce que vous avez des chaînes dans votre liste qui n'ont pas de double barre oblique inverse, donc elles sont déjà décodées. Vous devrez supprimer les bons avant, ou utiliser une fonction 'try: except' – eLRuLL

+2

Il s'agit plus probablement d'un problème lorsque vous essayez de _print_ la chaîne décodée dans un terminal qui ne peut pas mapper correctement ce char. Vérifiez votre message d'erreur pour la ligne où l'erreur se produit. Cette réponse est correcte. – jsbueno

1

Puisque vous utilisez Python 2, il suffit de réappliquer la méthode "decode" en utilisant le codec spécial "unicode_escape". Il « voit » les contrecoups « physiques » et décode ces séquences propres caractères unicode:

data = [u'that\\u2019s', u'it\\u2019ll', u'It\\u2019s', u'don\\u2019t', u'That\\u2019s', u'we\\u2019re', u'\\u2013'] 

result = [part.decode('unicode_escape') for part in data] 

Pour aAnyone obtenir ici en utilisant python3: dans cette version ne peut pas appliquer la méthode du « décodage » aux str objets livrés par beautifulsoup - il faut d'abord les réencoder en objets octets, puis les décoder avec le codec uncode_escape. À ces fins, il est utile d'utiliser des latin1 codec comme le transparent encodage: tous les octets dans l'objet str sont conservés dans les nouveaux octets objet:

result = [part.encode('latin1').decode('unicode_escape') for part in data] 
+0

AttributeError: l'objet 'str' n'a pas d'attribut 'decode' –

+1

Vous utilisez Python 3, et l'OP et cet exemple sont tous les deux dans Python2. (En python 2, pour commencer, une chaîne préfixée «u» "' est un objet unicode, pas un str). S'il vous plaît, le système de vote n'est pas destiné à des vendetas personnelles - il est destiné à marquer les réponses incorrectes. – jsbueno

+0

Je ne vois pas dans la question de référence pour la version Python –