Python-String wird als [u'String '] gedruckt


142

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?


Mögliches Duplikat der viel klarer formulierten Frage (und Antwort): stackoverflow.com/q/2464959/1390788
Terrabits

Antworten:


118

[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:

 soup[0].encode("ascii")

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.

 soup[0].encode("latin-1")


 soup[0].encode("utf-8")

Oder Sie fragen Beautiful Soup nach der ursprünglichen Codierung und erhalten sie in dieser Codierung zurück:

 soup[0].encode(soup.originalEncoding)

6
Sie müssen die Codierung tatsächlich nicht durchführen, da im OP nur die Zeichenfolge repr angezeigt wird, da Sie beim Drucken einer Liste auf diese Weise alles sehen. suppe [0] reicht aus, um den str anstelle des repr anzuzeigen, wobei der Inhalt des Strings und nicht der Modifikator für Anführungszeichen und Unicode angezeigt wird.
Ironfroggy

2
In den meisten Fällen sollten Sie den als Unicode dargestellten Text nicht in Bytes codieren: Sie sollten Unicode direkt in Python drucken:print(', '.join([u'ABC' , u'...']))
jfs

26

Sie haben wahrscheinlich eine Liste mit einer Unicode-Zeichenfolge. Das reprdavon ist [u'String'].

Sie können dies in eine Liste von Byte-Zeichenfolgen konvertieren, indem Sie eine der folgenden Variationen verwenden:

# Functional style.
print map(lambda x: x.encode('ascii'), my_list)

# List comprehension.
print [x.encode('ascii') for x in my_list]

# Interesting if my_list may be a tuple or a string.
print type(my_list)(x.encode('ascii') for x in my_list)

# What do I care about the brackets anyway?
print ', '.join(repr(x.encode('ascii')) for x in my_list)

# That's actually not a good way of doing it.
print ' '.join(repr(x).lstrip('u')[1:-1] for x in my_list)

1
Bitte vermeiden Sie solche Schrecken wie repr(x).lstrip('u')[1:-1]. Verwenden Sie print ", ".join(my_list)stattdessen Folgendes, um eine Liste von Unicode-Zeichenfolgen zu formatieren.
JFS

1
In dem Kommentar heißt es: "Das ist eigentlich kein guter Weg, es zu tun". Es ist nur für die lolz hier!
Ddaa

9
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

wird gedruckt

{'name': 'A', 'primary_key': 1}

1
Diese Methode sieht für mich ziemlich süß aus, warum keine Stimmen? Gibt es Auswirkungen auf die Leistung, über die wir uns Sorgen machen sollten?
jrich523

8

Beim Zugriff auf / Drucken einzelner Elementlisten (z. B. nacheinander oder gefiltert):

my_list = [u'String'] # sample element
my_list = [str(my_list[0])]

1
Sie machen eine Liste Verständnis:my_list = [str(my_list[x]) for x in range(len(my_list))]
Gevang

4

Ü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.


4

[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 erstellen list, 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. Oft eval(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.


3

Verwenden Sie diroder typeauf 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?


Ich habe mir BeautifulSoup seit den letzten Tagen angesehen. Ich konnte nicht herausfinden, wie Gnuchu dich ['string'] und nicht [u'String '] bekommen würde. Sein Kommentar zu Andrew Jaffe scheint zu beweisen, dass es sich um eine Liste handelt.
Batbrat

3

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.)


Ich hätte klarer sein sollen. Ich verwende str (), erhalte aber beim Drucken immer noch die Ausgabe wie unten. [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] Die Daten werden als Text von einer Webseite entfernt, dann in eine Datenbank (Google Appstore) eingefügt, abgerufen und gedruckt.
Gnuchu

-1

encode("latin-1") hat mir in meinem Fall geholfen:

facultyname[0].encode("latin-1")

-1

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

        avail = []
        avail = driver.find_elements_by_class_name("label");
        for i in avail:
                if  i.text == "MyText":

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?


Sie fehlt den Teil , wo die Frage ist etwa , wie „die Zeichenfolge i Convert“ zu tun.
Nathan Tuggy

ahhh, danke von all den Kommentaren, die ich dachte, das Problem würde den Wert zum Konvertieren bekommen
Steven

Um fair zu sein, ist i.text der tatsächliche Zeichenfolgenwert. Es ist nicht erforderlich, ihn "aus einem Array herauszuziehen", wie einige Leute vorgeschlagen haben, wenn das Label elemet beispielsweise den Textwert [u'String '] i.text hat wird String sein
Steven
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.