342 votes

Comment enlever \xa0 à partir d'une chaîne en Python ?

J'utilise actuellement Beautiful Soup pour analyser un fichier HTML et appeler get_text() mais j'ai l'impression qu'on me laisse avec beaucoup de \xa0 Unicode représentant des espaces. Existe-t-il un moyen efficace de les supprimer tous dans Python 2.7, et de les transformer en espaces ? Je suppose que la question plus générale serait : existe-t-il un moyen de supprimer le formatage Unicode ?

J'ai essayé d'utiliser : line = line.replace(u'\xa0',' ') comme le suggérait un autre fil de discussion, mais cela a modifié le résultat de l'opération. \xa0 des "u", donc maintenant j'ai des "u" partout à la place. ) :

EDIT : Le problème semble être résolu par str.replace(u'\xa0', ' ').encode('utf-8') mais je fais juste .encode('utf-8') sans replace() semble lui faire cracher des caractères encore plus bizarres, \xc2 par exemple. Quelqu'un peut-il expliquer cela ?

0 votes

J'ai déjà essayé, le codec 'ascii' ne peut pas décoder l'octet 0xa0 en position 0 : ordinal not in range(128)

18 votes

Embrasser Unicode. Utilisez u'' au lieu de '' s. :-)

2 votes

J'ai essayé d'utiliser str.replace(u') \xa0 ', ' ') mais il y a des "u" partout au lieu de \xa0s :/

6voto

7SpecialGems Points 1950

C'est l'équivalent d'un caractère d'espacement, il faut donc le supprimer.

print(string.strip()) # no more xa0

6 votes

Cela ne le supprimera que s'il se trouve au début ou à la fin de la chaîne.

4voto

dda Points 4419

0xA0 (Unicode) est 0xC2A0 en UTF-8. .encode('utf8') prendra simplement votre Unicode 0xA0 et le remplacera par le 0xC2A0 de l'UTF-8. D'où l'apparition des 0xC2s... Encoder n'est pas remplacer, comme vous l'avez probablement compris maintenant.

1 votes

0xc2a0 est ambiguë (ordre des octets). Utilisez b'\xc2\xa0' octets littéral à la place.

3voto

SaemaMiftah Points 11

Vous pouvez essayer string.strip()
Ça a marché pour moi ! :)

1voto

ranaFire Points 9

Version générique avec l'expression régulière (Elle supprimera tous les caractères de contrôle) :

import re
def remove_control_chart(s):
    return re.sub(r'\\x..', '', s)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X