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

15voto

J'ai rencontré le même problème pour extraire des données d'une base de données sqlite3 avec python. Les réponses ci-dessus n'ont pas fonctionné pour moi (je ne sais pas pourquoi), mais celle-ci a fonctionné : line = line.decode('ascii', 'ignore') Cependant, mon objectif était de supprimer le \xa0s plutôt que de les remplacer par des espaces.

J'ai trouvé ça dans ce tutoriel très utile sur l'unicode par Ned Batchelder.

15 votes

Vous supprimez maintenant tout ce qui n'est pas un caractère ASCII, vous masquez probablement votre problème réel. En utilisant 'ignore' c'est comme pousser le levier de vitesse même si vous ne comprenez pas comment fonctionne l'embrayage

0 votes

@MartijnPieters Le tutoriel sur l'unicode est bon, mais vous avez tout à fait raison str.encode(..., 'ignore') est l'équivalent de la gestion d'Unicode de try: ... except: ... . Bien que cela puisse masquer le message d'erreur, cela résout rarement le problème.

2 votes

Pour certains usages, comme le traitement des EMAIL ou des URL, il semble parfait de l'utiliser. .decode('ascii', 'ignore')

12voto

shiva Points 133

Essayez ce code

import re
re.sub(r'[^\x00-\x7F]+','','paste your string here').decode('utf-8','ignore').strip()

11voto

Jonhy Beebop Points 713

Python le reconnaît comme un caractère d'espacement, vous pouvez donc split sans arguement et joint par un espace normal :

line = ' '.join(line.split())

9voto

andi Points 1035

J'ai atterri ici en cherchant sur Google le problème des caractères non imprimables. J'utilise MySQL UTF-8 general_ci et s'occuper de la langue polonaise. Pour les chaînes de caractères problématiques, je dois procéder comme suit :

text=text.replace('\xc2\xa0', ' ')

C'est juste une solution de contournement rapide et vous devriez probablement essayer quelque chose avec la bonne configuration d'encodage.

2 votes

Cela fonctionne si text est un bytestring qui représente un texte codé en utf-8. Si vous travaillez avec du texte, décodez-le d'abord en Unicode ( .decode('utf-8') ) et le coder en bytestring uniquement à la toute fin (si l'API ne supporte pas directement Unicode, par exemple, socket ). Toutes les opérations intermédiaires sur le texte doivent être effectuées sur Unicode.

6voto

Mark Points 41

Dans Belle Soupe, vous pouvez passer get_text() le paramètre strip, qui supprime les espaces blancs au début et à la fin du texte. Cela supprimera \xa0 ou tout autre espace blanc s'il se trouve au début ou à la fin de la chaîne. Belle Soupe a remplacé une chaîne vide par \xa0 et cela a résolu le problème pour moi.

mytext = soup.get_text(strip=True)

10 votes

strip=True ne fonctionne que si   se trouve au début ou à la fin de chaque morceau de texte. Il ne supprimera pas l'espace s'il se trouve entre d'autres caractères du texte.

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