Dies wird sicherlich leicht sein, aber es nervt mich wirklich.
Ich habe ein Skript, das eine Webseite einliest und Beautiful Soup verwendet , um sie zu analysieren. Aus der Suppe extrahiere ich alle Links, da mein letztes Ziel darin besteht, die link.contents auszudrucken.
Der gesamte Text, den ich analysiere, ist ASCII. Ich weiß, dass Python Strings als Unicode behandelt, und ich bin sicher, dass dies sehr praktisch ist und in meinem kleinen Skript nur keinen Nutzen hat.
Jedes Mal, wenn ich eine Variable drucke, die 'String' enthält, werde ich [u'String']
auf dem Bildschirm gedruckt. Gibt es eine einfache Möglichkeit, dies wieder in ASCII zu bringen, oder sollte ich eine Regex schreiben, um es zu entfernen?
Antworten:
[u'ABC']
wäre eine Ein-Element-Liste von Unicode-Zeichenfolgen. Schöne Suppe produziert immer Unicode . Sie müssen also die Liste in eine einzelne Unicode-Zeichenfolge konvertieren und diese dann in ASCII konvertieren.Ich weiß nicht genau, wie Sie zu den Ein-Element-Listen gekommen sind. Das Inhaltselement wäre eine Liste von Zeichenfolgen und Tags, was anscheinend nicht das ist, was Sie haben. Angenommen, Sie erhalten wirklich immer eine Liste mit einem einzelnen Element und Ihr Test ist wirklich nur ASCII. Dann würden Sie Folgendes verwenden:
Bitte überprüfen Sie jedoch noch einmal, ob Ihre Daten wirklich ASCII sind. Das ist ziemlich selten. Viel wahrscheinlicher ist es Latin-1 oder Utf-8.
Oder Sie fragen Beautiful Soup nach der ursprünglichen Codierung und erhalten sie in dieser Codierung zurück:
quelle
print(', '.join([u'ABC' , u'...']))
Sie haben wahrscheinlich eine Liste mit einer Unicode-Zeichenfolge. Das
repr
davon ist[u'String']
.Sie können dies in eine Liste von Byte-Zeichenfolgen konvertieren, indem Sie eine der folgenden Variationen verwenden:
quelle
repr(x).lstrip('u')[1:-1]
. Verwenden Sieprint ", ".join(my_list)
stattdessen Folgendes, um eine Liste von Unicode-Zeichenfolgen zu formatieren.wird gedruckt
quelle
Beim Zugriff auf / Drucken einzelner Elementlisten (z. B. nacheinander oder gefiltert):
quelle
my_list = [str(my_list[x]) for x in range(len(my_list))]
Übergeben Sie die Ausgabe an die Funktion str (), und die Konvertierung der Unicode-Ausgabe wird entfernt. Durch Drucken der Ausgabe werden auch die u '' - Tags entfernt.
quelle
[u'String']
ist eine Textdarstellung einer Liste, die eine Unicode-Zeichenfolge in Python 2 enthält.Wenn Sie ausführen
print(some_list)
, entspricht dies,print'[%s]' % ', '.join(map(repr, some_list))
dh, um eine Textdarstellung eines Python-Objekts mit dem Typ zu erstellenlist
,repr()
wird für jedes Element eine Funktion aufgerufen.Verwechseln Sie ein Python-Objekt und seine Textdarstellung nicht -
repr('a') != 'a'
und selbst die Textdarstellung der Textdarstellung unterscheidet sich :repr(repr('a')) != repr('a')
.repr(obj)
Gibt eine Zeichenfolge zurück, die eine druckbare Darstellung eines Objekts enthält. Sein Zweck ist es, eine eindeutige Darstellung eines Objekts zu sein, das zum Debuggen in einer REPL nützlich sein kann. Ofteval(repr(obj)) == obj
.Um einen Anruf zu vermeiden,
repr()
können Sie Listenelemente direkt drucken (wenn es sich ausschließlich um Unicode-Zeichenfolgen handelt). Beispiel:print ",".join(some_list)
- Es wird eine durch Kommas getrennte Liste der Zeichenfolgen gedruckt:String
Codieren Sie eine Unicode-Zeichenfolge nicht mit einer fest codierten Zeichencodierung in Bytes, sondern drucken Sie stattdessen Unicode direkt . Andernfalls kann der Code fehlschlagen, da die Codierung nicht alle Zeichen darstellen kann, z. B. wenn Sie versuchen, die
'ascii'
Codierung mit Nicht-ASCII-Zeichen zu verwenden. Oder der Code erzeugt stillschweigend Mojibake (beschädigte Daten werden in einer Pipeline weitergeleitet), wenn die Umgebung eine Codierung verwendet, die mit der fest codierten Codierung nicht kompatibel ist.quelle
Verwenden Sie
dir
odertype
auf der 'Zeichenfolge', um herauszufinden, was es ist. Ich vermute, dass es eines der Tag-Objekte von BeautifulSoup ist, das wie eine Zeichenfolge gedruckt wird, aber wirklich keines ist. Andernfalls befindet es sich in einer Liste und Sie müssen jede Zeichenfolge separat konvertieren.Warum lehnen Sie auf jeden Fall die Verwendung von Unicode ab? Gibt es einen bestimmten Grund?
quelle
Meinst du wirklich
u'String'
?Können Sie auf keinen Fall einfach
str(string)
eine Zeichenfolge anstelle einer Unicode-Zeichenfolge abrufen? (Dies sollte für Python 3 anders sein, für das alle Zeichenfolgen Unicode sind.)quelle
encode("latin-1")
hat mir in meinem Fall geholfen:quelle
Vielleicht verstehe ich nicht, warum kannst du nicht einfach den element.text bekommen und ihn dann konvertieren, bevor du ihn verwendest? Zum Beispiel (ich weiß nicht, warum Sie das tun würden, aber ...) finden Sie alle Beschriftungselemente der Webseite und iterieren Sie zwischen ihnen, bis Sie eines mit dem Namen MyText finden
Konvertiere den String von i und mache was du willst ... vielleicht fehlt mir etwas in der ursprünglichen Nachricht? oder war es das, wonach du gesucht hast?
quelle