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

396voto

samwize Points 4144

\xa0 est en fait un espace insécable en Latin1 (ISO 8859-1), également chr(160). Vous devriez le remplacer par un espace.

string = string.replace(u'\xa0', u' ')

Lorsque .encode('utf-8'), il codera l'unicode en utf-8, ce qui signifie que chaque unicode peut être représenté par 1 à 4 octets. Dans ce cas, \xa0 est représenté par 2 octets \xc2\xa0.

Lire la suite http://docs.python.org/howto/unicode.html .

Remarque : cette réponse date de 2012, Python a évolué, vous devriez pouvoir utiliser unicodedata.normalize maintenant

16 votes

Je ne connais pas grand chose à Unicode et aux codages de caractères, mais il semble que unicodedata.normalize serait plus approprié que str.replace

0 votes

Votre conseil est valable pour les chaînes de caractères, mais notez que toutes les références à cette chaîne devront également être remplacées. Par exemple, si vous avez un programme qui ouvre des fichiers, et que l'un des fichiers a un espace insécable dans son nom, vous devrez renommer ce fichier en plus d'effectuer ce remplacement.

4 votes

U+00a0 est un caractère Unicode d'espace insécable. qui peut être codé comme b'\xa0' octet en codage latin1, sous forme de deux octets b'\xc2\xa0' en encodage utf-8. Il peut être représenté comme suit   en html.

312voto

Jamie Points 2808

Il y a beaucoup d'éléments utiles dans l'outil Python unicodedata bibliothèque. L'un d'entre eux est le .normalize() función.

Essayez :

new_str = unicodedata.normalize("NFKD", unicode_str)

Remplacer le NFKD par l'une des autres méthodes énumérées dans le lien ci-dessus si vous n'obtenez pas les résultats escomptés.

0 votes

Cela a fait l'affaire. J'avais du HTML généré par... Microsoft Word avec beaucoup de caractères unicode bizarres et ça les a tous nettoyés.

3 votes

Pas si sûr, vous pourriez vouloir normalize('NFKD', '1º\xa0dia') pour renvoyer "1º dia" mais il renvoie "1o dia".

5 votes

35voto

Ali Raza Bhayani Points 395

Après avoir essayé plusieurs méthodes, pour résumer, voici comment j'ai procédé. Voici deux façons d'éviter/supprimer \xa0 caractères de la chaîne HTML analysée.

Supposons que nous ayons notre html brut comme suit :

raw_html = '<p>Dear Parent, </p><p><span style="font-size: 1rem;">This is a test message, </span><span style="font-size: 1rem;">kindly ignore it. </span></p><p><span style="font-size: 1rem;">Thanks</span></p>'

Essayons donc de nettoyer cette chaîne HTML :

from bs4 import BeautifulSoup
raw_html = '<p>Dear Parent, </p><p><span style="font-size: 1rem;">This is a test message, </span><span style="font-size: 1rem;">kindly ignore it. </span></p><p><span style="font-size: 1rem;">Thanks</span></p>'
text_string = BeautifulSoup(raw_html, "lxml").text
print text_string
#u'Dear Parent,\xa0This is a test message,\xa0kindly ignore it.\xa0Thanks'

Le code ci-dessus produit ces caractères \xa0 dans la chaîne. Pour les supprimer correctement, nous pouvons utiliser deux méthodes.

Méthode n° 1 (recommandée) : Le premier est celui de BeautifulSoup get_text méthode avec dépouiller l'argument comme Vrai Donc notre code devient :

clean_text = BeautifulSoup(raw_html, "lxml").get_text(strip=True)
print clean_text
# Dear Parent,This is a test message,kindly ignore it.Thanks

Méthode n° 2 : L'autre option consiste à utiliser la bibliothèque unicodedata de Python.

import unicodedata
text_string = BeautifulSoup(raw_html, "lxml").text
clean_text = unicodedata.normalize("NFKD",text_string)
print clean_text
# u'Dear Parent,This is a test message,kindly ignore it.Thanks'

J'ai également détaillé ces méthodes sur ce blog à laquelle vous pouvez vous référer.

29voto

user3590113 Points 469

Essayez d'utiliser .strip() à la fin de votre ligne. line.strip() a bien fonctionné pour moi

21voto

user278064 Points 5193

Essayez ceci :

string.replace('\\xa0', ' ')

6 votes

@RyanMartin : cela remplace quatre octets : len(b'\\xa0') == 4 mais len(b'\xa0') == 1 . Si possible, vous devriez corriger en amont ce qui génère ces échappatoires.

3 votes

Cette solution a fonctionné pour moi : string.replace('\xa0', ' ')

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