web-dev-qa-db-fra.com

Python - Remplace le caractère non ascii dans la chaîne (»)

J'ai besoin de remplacer dans une chaîne le caractère "" "par un espace, mais je reçois toujours une erreur. Voici le code que j'utilise:

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup

# other code

soup = BeautifulSoup(data, 'lxml')
mystring = soup.find('a').text.replace(' »','')

UnicodeEncodeError: le codec 'ascii' ne peut pas coder le caractère u '\ xbb' en position 13: l'ordinal n'est pas dans la plage (128)

Mais si je le teste avec cet autre script:

# -*- coding: utf-8 -*-
a = "hi »"
b = a.replace('»','') 

Ça marche. Pourquoi ça?

13
Hyperion

Afin de remplacer le contenu de la chaîne en utilisant la méthode str.replace(); vous devez d'abord décoder la chaîne, puis remplacer le texte et le recoder dans le texte d'origine:

>>> a = "hi »"
>>> a.decode('utf-8').replace("»".decode('utf-8'), "").encode('utf-8')
'hi '

Vous pouvez également utiliser l'expression régulière suivante pour supprimer tous les caractères non ascii de la chaîne:

>>> import re
>>> re.sub(r'[^\x00-\x7f]',r'', 'hi »')
'hi '
16
Moinuddin Quadri

La réponse de @Moinuddin Quadri s'adapte mieux à votre cas d'utilisation, mais en général, un moyen simple de supprimer des caractères non ASCII d'une chaîne donnée consiste à procéder comme suit:

# the characters '¡' and '¢' are non-ASCII
string = "hello, my name is ¢arl... ¡Hola!"

all_ascii = ''.join(char for char in string if ord(char) < 128)

Il en résulte:

>>> print(all_ascii)
"hello, my name is arl... Hola!"

Vous pouvez également faire ceci:

''.join(filter(lambda c: ord(c) < 128, string))

Mais c'est environ 30% plus lent que le char for char ... approche.

6
blacksite