Ich verwende derzeit Beautiful Soup, um eine HTML-Datei zu analysieren und aufzurufen get_text()
, aber es scheint, als würde mir eine Menge \ xa0 Unicode übrig bleiben, die Leerzeichen darstellen. Gibt es eine effiziente Möglichkeit, alle in Python 2.7 zu entfernen und in Leerzeichen umzuwandeln? Ich denke, die allgemeinere Frage wäre, gibt es eine Möglichkeit, die Unicode-Formatierung zu entfernen?
Ich habe versucht line = line.replace(u'\xa0',' ')
,: zu verwenden , wie von einem anderen Thread vorgeschlagen, aber das hat die \ xa0 in u geändert, sodass ich jetzt stattdessen überall "u" habe. ):
EDIT: Das Problem scheint gelöst zu werden str.replace(u'\xa0', ' ').encode('utf-8')
, aber nur tun , .encode('utf-8')
ohne replace()
es zu verursachen scheint noch seltsame Zeichen auszuzuspucken, \ xc2 zum Beispiel. Kann jemand das erklären?
u''
s anstelle von''
s. :-)u' '
Ersetzung verwenden, nicht die' '
. Ist die ursprüngliche Zeichenfolge die Unicode-Zeichenfolge?Antworten:
\ xa0 ist in Latin1 (ISO 8859-1), auch chr (160), ein nicht unterbrechender Raum. Sie sollten es durch ein Leerzeichen ersetzen.
string = string.replace(u'\xa0', u' ')
Wenn .encode ('utf-8'), wird der Unicode in utf-8 codiert, was bedeutet, dass jeder Unicode durch 1 bis 4 Bytes dargestellt werden kann. In diesem Fall wird \ xa0 durch 2 Bytes \ xc2 \ xa0 dargestellt.
Lesen Sie unter http://docs.python.org/howto/unicode.html nach .
Bitte beachten Sie: Diese Antwort aus dem Jahr 2012, Python ist weitergegangen, sollten Sie
unicodedata.normalize
jetzt verwenden könnenquelle
b'\xa0'
bei der Latin1-Codierung als Byte undb'\xc2\xa0'
bei der Utf-8-Codierung als zwei Bytes codiert werden kann. Es kann wie
in HTML dargestellt werden.UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 397: ordinal not in range(128)
.Es gibt viele nützliche Dinge in Pythons
unicodedata
Bibliothek. Eine davon ist die.normalize()
Funktion.Versuchen:
Ersetzen Sie NFKD durch eine der anderen im obigen Link aufgeführten Methoden, wenn Sie nicht die gewünschten Ergebnisse erzielen.
quelle
normalize('NFKD', '1º\xa0dia')
'1º dia' zurückgeben, aber es gibt '1o dia'unicodedata.normalize
Versuchen Sie es mit .strip () am Ende Ihrer Zeile
line.strip()
für mich gut funktioniert hatquelle
Nachdem ich verschiedene Methoden ausprobiert habe, um es zusammenzufassen, habe ich es so gemacht. Im Folgenden finden Sie zwei Möglichkeiten zum Vermeiden / Entfernen von \ xa0-Zeichen aus analysierten HTML-Zeichenfolgen.
Angenommen, wir haben unser rohes HTML wie folgt:
Versuchen wir also, diese HTML-Zeichenfolge zu bereinigen:
Der obige Code erzeugt diese Zeichen \ xa0 in der Zeichenfolge. Um sie richtig zu entfernen, können wir zwei Möglichkeiten verwenden.
Methode 1 (empfohlen): Die erste ist die get_text- Methode von BeautifulSoup mit dem Strip-Argument True. Unser Code wird also zu:
Methode 2: Die andere Option besteht darin, die Unicodedata der Python-Bibliothek zu verwenden
Ich habe diese Methoden auch in diesem Blog detailliert beschrieben, auf die Sie möglicherweise verweisen möchten.
quelle
Versuche dies:
quelle
len(b'\\xa0') == 4
aberlen(b'\xa0') == 1
. Wenn möglich; Sie sollten den Upstream reparieren, der diese Escapes generiert.Ich hatte das gleiche Problem beim Abrufen einiger Daten aus einer SQLite3-Datenbank mit Python. Die obigen Antworten haben bei mir nicht funktioniert (ich weiß nicht warum), aber das hat funktioniert:
line = line.decode('ascii', 'ignore')
weiß Mein Ziel war es jedoch, die \ xa0s zu löschen, anstatt sie durch Leerzeichen zu ersetzen.Ich habe dies aus diesem super hilfreichen Unicode-Tutorial von Ned Batchelder erhalten.
quelle
'ignore'
ist wie das Durchschieben des Schalthebels, obwohl Sie nicht verstehen, wie die Kupplung funktioniert.str.encode(..., 'ignore')
dem Unicode-Handlingtry: ... except: ...
. Die Fehlermeldung wird möglicherweise ausgeblendet, das Problem wird jedoch selten gelöst..decode('ascii', 'ignore')
line.decode()
In Ihrer Antwort wird darauf hingewiesen , dass es sich bei Ihrer Eingabe um einen Bytestring handelt (Sie sollten keine.decode()
Unicode-Zeichenfolge aufrufen (um dies zu erzwingen, wird die Methode in Python 3 entfernt). Ich verstehe nicht, wie das von Ihnen verwendete Lernprogramm angezeigt werden kann in Ihrer Antwort verknüpft und verpassen Sie den Unterschied zwischen Bytes und Unicode (mischen Sie sie nicht).Ich lande hier, während ich nach dem Problem mit dem nicht druckbaren Zeichen google. Ich benutze MySQL
UTF-8
general_ci
und beschäftige mich mit polnischer Sprache. Für problematische Saiten muss ich wie folgt vorgehen:Es ist nur eine schnelle Problemumgehung und Sie sollten wahrscheinlich etwas mit der richtigen Codierungskonfiguration ausprobieren.
quelle
text
es sich um einen Bytestring handelt, der einen mit utf-8 codierten Text darstellt. Wenn Sie mit Text arbeiten; dekodiere es zuerst in Unicode (.decode('utf-8')
) und kodiere es erst ganz am Ende in einen Bytestring (wenn die API Unicode nicht direkt unterstützt, zsocket
. B. ). Alle Zwischenoperationen am Text sollten unter Unicode ausgeführt werden.Versuchen Sie diesen Code
quelle
0xA0 (Unicode) ist in UTF-8 0xC2A0.
.encode('utf8')
Nehmen Sie einfach Ihren Unicode 0xA0 und ersetzen Sie ihn durch den 0xC2A0 von UTF-8. Daher die Erscheinung von 0xC2s ... Die Codierung ersetzt nicht, wie Sie wahrscheinlich jetzt erkannt haben.quelle
0xc2a0
ist mehrdeutig (Bytereihenfolge). Verwenden Sieb'\xc2\xa0'
stattdessen das Byte-Literal.Es ist das Äquivalent eines Leerzeichens, also zieh es aus
quelle
In Beautiful Soup können Sie
get_text()
den Strip-Parameter übergeben, der Leerzeichen vom Anfang und Ende des Textes entfernt. Dadurch werden\xa0
andere Leerzeichen entfernt, wenn sie am Anfang oder Ende der Zeichenfolge auftreten. Beautiful Soup ersetzte eine leere Saite durch\xa0
und dies löste das Problem für mich.quelle
strip=True
funktioniert nur, wenn
es am Anfang oder Ende jedes Textbits steht. Das Leerzeichen wird nicht entfernt, wenn es sich zwischen anderen Zeichen im Text befindet.Generische Version mit dem regulären Ausdruck (alle Steuerzeichen werden entfernt):
quelle
Python erkennt es wie ein Leerzeichen, sodass Sie
split
es ohne Argumente verwenden und durch ein normales Leerzeichen verbinden können:quelle