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?
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 '
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.