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?

154
demandé sur dda 2012-06-12 13:12:32

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.

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

164
répondu samwize 2015-11-20 21:31:23

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.

118
répondu Jamie 2016-01-08 04:24:55

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.

12
répondu 2012-12-11 20:39:35

essayez ceci:

string.replace('\xa0', ' ')
9
répondu user278064 2012-06-12 09:20:32

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

8
répondu user3590113 2015-07-21 21:50:36

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.

7
répondu Andrzej Kostański 2015-06-10 15:30:45

essayez ce code

import re
re.sub(r'[^\x00-\x7F]+','','paste your string here').decode('utf-8','ignore').strip()
6
répondu shiva 2017-03-20 13:04:08

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.

4
répondu dda 2012-09-26 05:55:30

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.

1
répondu Ali Raza Bhayani 2018-01-16 16:57:40

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)
0
répondu Mark 2015-01-19 15:25:29

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)
0
répondu ranaFire 2018-08-30 06:23:59