Ich habe eine Zeichenfolge, die so aussieht:
6Â 918Â 417Â 712
Die eindeutige Methode zum Trimmen dieser Zeichenfolge (wie ich Python verstehe) besteht einfach darin, zu sagen, dass sich die Zeichenfolge in einer Variablen namens s
befindet. Wir erhalten:
s.replace('Â ', '')
Das sollte den Trick machen. Aber natürlich beschwert es sich, dass das Nicht-ASCII-Zeichen'\xc2'
in der Datei blabla.py nicht codiert ist.
Ich konnte nie ganz verstehen, wie man zwischen verschiedenen Codierungen wechselt.
Hier ist der Code, er ist wirklich genauso wie oben, aber jetzt ist er im Kontext. Die Datei wird als UTF-8 im Editor gespeichert und hat den folgenden Header:
#!/usr/bin/python2.4
# -*- coding: utf-8 -*-
Der Code:
f = urllib.urlopen(url)
soup = BeautifulSoup(f)
s = soup.find('div', {'id':'main_count'})
#making a print 's' here goes well. it shows 6Â 918Â 417Â 712
s.replace('Â ','')
save_main_count(s)
Es geht nicht weiter als s.replace
...
u
Antworten:
Python 2 verwendet
ascii
als Standardcodierung für Quelldateien. Dies bedeutet, dass Sie oben in der Datei eine andere Codierung angeben müssen, um Nicht-ASCII-Unicode-Zeichen in Literalen zu verwenden. Python 3 verwendetutf-8
als Standardcodierung für Quelldateien, sodass dies weniger problematisch ist.Siehe: http://docs.python.org/tutorial/interpreter.html#source-code-encoding
Um die utf-8-Quellcodierung zu aktivieren, wird dies in einer der beiden oberen Zeilen angegeben:
Das Obige ist in den Dokumenten, aber das funktioniert auch:
Weitere Überlegungen:
Die Quelldatei muss auch in Ihrem Texteditor mit der richtigen Codierung gespeichert werden.
In Python 2 muss dem Unicode-Literal ein
u
vorangestellt sein, wies.replace(u"Â ", u"")
in Python 3. Verwenden Sie jedoch nur Anführungszeichen. In Python 2 können Siefrom __future__ import unicode_literals
das Python 3-Verhalten abrufen. Beachten Sie jedoch, dass dies das gesamte aktuelle Modul betrifft.s.replace(u"Â ", u"")
schlägt auch fehl, wenns
es sich nicht um eine Unicode-Zeichenfolge handelt.string.replace
Gibt eine neue Zeichenfolge zurück und wird nicht an Ort und Stelle bearbeitet. Stellen Sie daher sicher, dass Sie auch den Rückgabewert verwendenquelle
# coding: utf-8
.-*-
ist nicht für die Dekoration, aber Sie werden es wahrscheinlich nie brauchen. Ich denke, es war für alte Muscheln da.edit: Mein erster Impuls ist immer, einen Filter zu verwenden, aber der Generatorausdruck ist speichereffizienter (und kürzer) ...
Beachten Sie, dass dies garantiert mit der UTF-8-Codierung funktioniert (da für alle Bytes in Mehrbyte-Zeichen das höchste Bit auf 1 gesetzt ist).
quelle
u
ein Literal vorangestellt ist .quelle
Der folgende Code ersetzt alle Nicht-ASCII-Zeichen durch Fragezeichen.
quelle
Regex verwenden:
quelle
Viel zu spät für eine Antwort, aber die ursprüngliche Zeichenfolge war in UTF-8 und '\ xc2 \ xa0' ist UTF-8 für NO-BREAK SPACE. Dekodieren Sie einfach die ursprüngliche Zeichenfolge als
s.decode('utf-8')
(\ xa0 wird bei falscher Dekodierung als Windows-1252 oder Latin-1 als Leerzeichen angezeigt:Beispiel (Python 3)
Ausgabe
quelle
Dies wird ausgedruckt
6 918 417 712
quelle
Ich weiß, dass es ein alter Thread ist, aber ich fühlte mich gezwungen, die Übersetzungsmethode zu erwähnen, die immer eine gute Möglichkeit ist, alle Zeichencodes über 128 (oder andere, falls erforderlich) zu ersetzen.
Verwendung : str. übersetzen ( Tabelle [, Löschzeichen] )
Ab Python 2.6 können Sie die Tabelle auch auf Keine setzen und mit deletechars die nicht gewünschten Zeichen löschen, wie in den Beispielen in den Standarddokumenten unter http://docs.python.org/library/stdtypes gezeigt. html .
Bei Unicode-Zeichenfolgen ist die Übersetzungstabelle keine Zeichenfolge mit 256 Zeichen, sondern ein Diktat mit der Ord () der relevanten Zeichen als Schlüssel. Trotzdem ist es einfach genug, eine richtige ASCII-Zeichenfolge aus einer Unicode-Zeichenfolge zu erhalten, indem die oben von truppo erwähnte Methode verwendet wird: unicode_string.encode ("ascii", "ignore")
Zusammenfassend
raise Exception, ascii_message
können Sie die folgende Funktion verwenden , wenn Sie aus irgendeinem Grund unbedingt eine ASCII-Zeichenfolge benötigen (z. B. wenn Sie eine Standardausnahme mit auslösen ):Das Gute an translate ist, dass Sie Zeichen mit Akzent tatsächlich in relevante ASCII-Zeichen ohne Akzent konvertieren können, anstatt sie einfach zu löschen oder durch '?' Zu ersetzen. Dies ist häufig nützlich, beispielsweise für Indizierungszwecke.
quelle
und machen Sie Ihre
.py
Datei Unicode.quelle
Dies ist ein schmutziger Hack, kann aber funktionieren.
quelle
Für das, was es wert war, war mein Zeichensatz
utf-8
und ich hatte die klassische "# -*- coding: utf-8 -*-
" Linie eingefügt.Ich stellte jedoch fest, dass ich beim Lesen dieser Daten von einer Webseite keine Universal Newlines hatte.
Mein Text hatte zwei Wörter, die durch "
\r\n
" getrennt waren. Ich habe mich nur auf die geteilt\n
und die ersetzt"\n"
.Als ich mich durchschleifte und den fraglichen Zeichensatz sah, erkannte ich den Fehler.
Es könnte sich also auch innerhalb des ASCII- Zeichensatzes befinden, aber ein Zeichen, das Sie nicht erwartet haben.
quelle