Python: le Retrait xa0 partir de la chaîne?
j'utilise actuellement Beautiful Soup pour analyser un fichier HTML et appeler get_text()
, mais il semble que je suis laissé avec beaucoup de xA0 Unicode représentant des espaces. Y a-t-il un moyen efficace de les enlever tous en Python 2.7, et de les transformer en espaces? Je suppose que la question la plus générale serait, y a-t-il un moyen de supprimer le formatage Unicode?
j'ai essayé d'utiliser: line = line.replace(u'xa0',' ')
, comme suggéré par un autre fil, mais qui a changé le xa0 en 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 faire .encode('utf-8')
sans replace()
semble faire sortir même des caractères plus bizarres, xc2 par exemple. Quelqu'un peut-il expliquer cela?
11 réponses
\xa0 est en fait l'espace insécable en Latin1 (ISO 8859-1), aussi chr(160). Vous devez le remplacer par un espace.
string = string.replace(u'\xa0', u' ')
quand .encoder ('utf-8'), Il encodera l'unicode en utf-8, ce qui signifie que chaque unicode peut être représenté par 1 à 4 octets. Pour ce cas, \xa0 est représenté par 2 octets \xc2\xa0.
il y a beaucoup de choses utiles dans la bibliothèque unicodedata
de Python. L'un d'eux est la fonction .normalize()
.
, Essayez:
new_str = unicodedata.normalize("NFKD", unicode_str)
remplacer NFKD par L'une des autres méthodes énumérées dans le lien ci-dessus si vous n'obtenez pas les résultats que vous recherchez.
j'ai rencontré ce même problème en tirant des données d'une base de données sqlite3 avec python. Les réponses ci-dessus n'ont pas fonctionné pour moi (pas sûr pourquoi), mais cela a fait: line = line.decode('ascii', 'ignore')
cependant, mon objectif était de supprimer les \xa0s, plutôt que de les remplacer par des espaces.
j'ai eu ça de ce super-utile tutoriel unicode par Ned Batchelder.
essayez d'utiliser .strip() à la fin de votre ligne de
line.strip()
a bien fonctionné pour moi
je me retrouve ici tout en googlant pour le problème avec caractère non imprimable. J'utilise MySQL UTF-8
general_ci
et je m'occupe de la langue polonaise. Pour les chaînes problématiques, je dois proceder comme suit:
text=text.replace('\xc2\xa0', ' ')
c'est juste un contournement rapide et vous devriez probablement essayer quelque chose avec la bonne configuration d'encodage.
essayez ce code
import re
re.sub(r'[^\x00-\x7F]+','','paste your string here').decode('utf-8','ignore').strip()
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 de 0xC2s... Encodage ne remplace pas, comme vous avez probablement réalisé maintenant.
après avoir essayé plusieurs méthodes, pour le résumer, c'est comme ça que je l'ai fait. Voici deux façons d'éviter/supprimer les caractères \xa0 de la chaîne HTML.
supposons que nous avons 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 de caractères. Pour les enlever correctement, nous pouvons utiliser deux façons.
Méthode No 1 (Recommandée): La première est la méthode de BeautifulSoup get_text avec strip argument as True Ainsi 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 # 2: L'autre option est d'utiliser la bibliothèque de python unicodedata
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 qui vous pouvez consulter.
dans belle soupe, vous pouvez passer get_text()
le paramètre bande, qui bande l'espace blanc du début et de la fin du texte. Cela supprimera \xa0
ou tout autre espace blanc si cela se produit au début ou à la fin de la chaîne. Belle soupe a remplacé une corde vide avec \xa0
et cela a résolu le problème pour moi.
mytext = soup.get_text(strip=True)
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)