web-dev-qa-db-fra.com

Python: Supprimer \ xa0 de la chaîne?

J'utilise actuellement Beautiful Soup pour analyser un fichier HTML et appeler get_text(), mais il me semble qu'il me reste beaucoup de Unicode\xa0 représentant des espaces. Existe-t-il un moyen efficace de tous les supprimer dans Python 2.7 et de les modifier en espaces? Je suppose que la question plus générale serait la suivante: existe-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 thread, mais cela a changé le\xa0 en u, donc maintenant j'ai "u" s à la place. ):

EDIT: Le problème semble être résolu par str.replace(u'\xa0', ' ').encode('utf-8'), mais le simple fait de .encode('utf-8') sans replace() semble le faire cracher même des caractères plus étranges,\xc2 par exemple. Quelqu'un peut-il expliquer cela?

194
zhuyxn

\ xa0 est en réalité un espace insécable en Latin1 (ISO 8859-1), également en 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 sur http://docs.python.org/howto/unicode.html .

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

218
samwize

Il y a beaucoup de choses utiles dans la bibliothèque unicodedata de Python. L'un d'eux est la fonction .normalize() .

Essayer:

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

Remplacez NFKD par l'une des autres méthodes répertoriées dans le lien ci-dessus si vous n'obtenez pas les résultats que vous recherchez.

169
Jamie

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

15
user3590113

J'ai rencontré ce même problème en extrayant des données d'une base de données sqlite3 avec Python. Les réponses ci-dessus n'ont pas fonctionné pour moi (je ne sais pas pourquoi), mais cela a été le cas: line = line.decode('ascii', 'ignore') Cependant, mon objectif était de supprimer les\xa0s, plutôt que de les remplacer par des espaces.

Je viens de ce tutoriel unicode très utile de Ned Batchelder.

12
user1774699

essaye ça:

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

Je me retrouve ici en cherchant Google pour le problème du caractère non imprimable. J'utilise MySQL UTF-8general_ci et gère le langage polonais. Pour les chaînes problématiques, je dois procéder comme suit:

text=text.replace('\xc2\xa0', ' ')

La solution de contournement est rapide et vous devriez probablement essayer quelque chose avec une configuration d’encodage correcte.

8
andilabs

Essayez ce code

import re
re.sub(r'[^\x00-\x7F]+','','paste your string here').decode('utf-8','ignore').strip()
7
shiva

Après avoir essayé plusieurs méthodes, voici comment je l’ai fait. Voici deux manières d'éviter/de supprimer les caractères\xa0 d'une chaîne HTML analysée.

Supposons que notre code HTML brut soit le suivant:

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 génère ces caractères \xa0 dans la chaîne. Pour les supprimer correctement, nous pouvons utiliser deux méthodes.

Méthode n ° 1 (recommandée): La première est la méthode de BeautifulSoup get_text avec l'argument strip comme vrai 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 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 que vous voudrez peut-être consulter.

6
Ali Raza Bhayani

0xA0 (Unicode) est 0xC2A0 en UTF-8. .encode('utf8') prendra simplement votre Unicode 0xA0 et le remplacera par le 0xC2A0 de UTF-8. D'où l'apparition de 0xC2s ... Le codage ne remplace pas, comme vous l'avez probablement compris maintenant.

4
dda

C'est l'équivalent d'un caractère d'espace, alors éliminez-le

print(string.strip()) # no more xa0
1
8bitjunkie

Dans Beautiful Soup, vous pouvez transmettre get_text() le paramètre strip, qui supprime les espaces depuis le début et la fin du texte. Cela supprimera \xa0 ou tout autre espace blanc s'il se produit au début ou à la fin de la chaîne. Beautiful Soup a remplacé une chaîne vide par \xa0 et cela a résolu le problème pour moi.

mytext = soup.get_text(strip=True)
1
Mark

Version générique avec l'expression régulière (tous les caractères de contrôle seront supprimés):

import re
def remove_control_chart(s):
    return re.sub(r'\\x..', '', s)
1
ranaFire

Python le reconnaît comme un caractère d'espacement, donc vous pouvez split le faire sans arguments et le joindre par un espace blanc normal:

line = ' '.join(line.split())
0
Jonhy Beebop