Hoe verwijder ik \xa0 uit string in Python?

Ik gebruik momenteel Beautiful Soup om een HTML-bestand te ontleden en get_text()aan te roepen, maar het lijkt alsof ik veel \xa0 Unicode voor spaties overhoud. Is er een efficiënte manier om ze allemaal in Python 2.7 te verwijderen en ze in spaties te veranderen? Ik denk dat de meer algemene vraag zou zijn: is er een manier om Unicode-opmaak te verwijderen?

Ik heb geprobeerd het volgende te gebruiken: line = line.replace(u'\xa0',' '), zoals gesuggereerd door een andere thread, maar dat veranderde de \xa0’s in u’s, dus nu heb ik ” in plaats daarvan ben je overal. ):

EDIT: Het probleem lijkt te zijn opgelost door str.replace(u'\xa0', ' ').encode('utf-8'), maar doe gewoon .encode('utf-8')zonder replace()lijkt ervoor te zorgen dat het nog vreemdere tekens uitspuugt, bijvoorbeeld \xc2. Kan iemand dit uitleggen?


Antwoord 1, autoriteit 100%

\xa0 is eigenlijk vaste spatie in Latijn1 (ISO 8859-1), ook wel chr(160). Je moet het vervangen door een spatie.

string = string.replace(u'\xa0', u' ')

Als .encode(‘utf-8’), wordt de unicode gecodeerd naar utf-8, wat betekent dat elke unicode kan worden weergegeven door 1 tot 4 bytes. In dit geval wordt \xa0 vertegenwoordigd door 2 bytes \xc2\xa0.

Lees meer op http://docs.python.org/howto/unicode.html.

Let op: dit antwoord uit 2012, Python is verder gegaan, je zou nu unicodedata.normalizemoeten kunnen gebruiken


Antwoord 2, autoriteit 83%

Er zijn veel nuttige dingen in de unicodedata-bibliotheek van Python. Een daarvan is de .normalize()functie.

Probeer:

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

NFKD vervangen door een van de andere methoden die in de bovenstaande link worden vermeld als u niet de gewenste resultaten krijgt.


Antwoord 3, autoriteit 8%

Probeer .strip() aan het einde van je regel te gebruiken
line.strip()werkte goed voor mij


Antwoord 4, autoriteit 7%

Na verschillende methoden geprobeerd te hebben, om het samen te vatten, is dit hoe ik het deed. Hieronder volgen twee manieren om \xa0-tekens uit de geparseerde HTML-tekenreeks te vermijden/verwijderen.

Stel dat we onze onbewerkte html als volgt hebben:

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

Dus laten we proberen deze HTML-tekenreeks op te schonen:

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'

De bovenstaande code produceert deze tekens \xa0in de tekenreeks. Om ze op de juiste manier te verwijderen, kunnen we twee manieren gebruiken.

Methode # 1 (aanbevolen):
De eerste is de get_text-methode van BeautifulSoup met het strip-argument als True
Dus onze code wordt:

clean_text = BeautifulSoup(raw_html, "lxml").get_text(strip=True)
print clean_text
# Dear Parent,This is a test message,kindly ignore it.Thanks

Methode #2:
De andere optie is om de unicodedata-bibliotheek van python te gebruiken

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'

Ik heb deze methoden ook gedetailleerd beschreven op deze blogwaarnaar je misschien wilt verwijzen.


Antwoord 5, autoriteit 5%

probeer dit:

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

Antwoord 6, autoriteit 4%

Ik kwam hetzelfde probleem tegen door met python wat gegevens uit een sqlite3-database te halen. De bovenstaande antwoorden werkten niet voor mij (niet zeker waarom), maar dit wel: line = line.decode('ascii', 'ignore')Mijn doel was echter het verwijderen van de \xa0s, in plaats van ze te vervangen door spaties.

Ik heb dit van deze superhandige unicode-tutorial van Ned Batchelder.


Antwoord 7, autoriteit 3%

Probeer deze code

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

Antwoord 8, autoriteit 2%

Ik kom hier terecht terwijl ik aan het googelen ben naar het probleem met niet-afdrukbare tekens. Ik gebruik MySQL UTF-8general_cien behandel Poolse taal. Voor problematische strings moet ik als volgt te werk gaan:

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

Het is gewoon een snelle oplossing en je zou waarschijnlijk iets moeten proberen met de juiste coderingsinstellingen.


Antwoord 9, autoriteit 2%

Python herkent het als een spatie, dus je kunt het splitzonder args en samenvoegen met een normale spatie:

line = ' '.join(line.split())

Antwoord 10

0xA0 (Unicode) is 0xC2A0 in UTF-8. .encode('utf8')neemt gewoon uw Unicode 0xA0 en vervangt deze door UTF-8’s 0xC2A0. Vandaar de verschijning van 0xC2s… Codering is niet aan vervanging toe, zoals je waarschijnlijk al besefte.


Antwoord 11

In Beautiful Soup kun je get_text()de stripparameter doorgeven, die witruimte aan het begin en einde van de tekst verwijdert. Hiermee wordt \xa0of elke andere witruimte verwijderd als deze aan het begin of het einde van de tekenreeks voorkomt. Beautiful Soup verving een lege string door \xa0en dit loste het probleem voor mij op.

mytext = soup.get_text(strip=True)

Antwoord 12

Het is het equivalent van een spatie, dus verwijder het

print(string.strip()) # no more xa0

Antwoord 13

Algemene versie met de reguliere expressie (alle controletekens worden verwijderd):

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

Antwoord 14

Je kunt string.strip()
proberen
Het werkte voor mij! 🙂

Other episodes