La stringa di Python viene stampata come [u'String ']


142

Sarà sicuramente facile, ma mi sta davvero infastidendo.

Ho una sceneggiatura che legge in una pagina web e usa Beautiful Soup per analizzarla. Dalla zuppa estraggo tutti i collegamenti poiché il mio obiettivo finale è quello di stampare i collegamenti.

Tutto il testo che sto analizzando è ASCII. So che Python tratta le stringhe come unicode e sono sicuro che sia molto utile, non serve a niente nel mio script.

Ogni volta che vado a stampare una variabile che contiene 'String', vengo [u'String']stampato sullo schermo. C'è un modo semplice per riportarlo in ascii o dovrei scrivere una regex per rimuoverlo?


possibile duplicato della domanda molto più chiaramente formulata (e risposta): stackoverflow.com/q/2464959/1390788
Terrabits

Questo risponde alla tua domanda? Qual è il prefisso u in una stringa Python?
Terrabits,

Risposte:


118

[u'ABC']sarebbe un elenco di un elemento di stringhe unicode. Beautiful Soup produce sempre Unicode . Quindi è necessario convertire l'elenco in una singola stringa unicode e quindi convertirlo in ASCII.

Non so esattamente come hai ottenuto gli elenchi a un elemento; il membro dei contenuti sarebbe un elenco di stringhe e tag, che apparentemente non è quello che hai. Supponendo che ottieni sempre un elenco con un singolo elemento e che il tuo test è in realtà solo ASCII, utilizzeresti questo:

 soup[0].encode("ascii")

Tuttavia, ricontrolla che i tuoi dati siano realmente ASCII. Questo è piuttosto raro. Molto più probabilmente è latin-1 o utf-8.

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


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

Oppure chiedi a Beautiful Soup quale fosse la codifica originale e recuperala in questa codifica:

 soup[0].encode(soup.originalEncoding)

6
In realtà non devi fare la codifica, perché l'OP vede solo la stringa repr perché è così che vedi qualcosa quando stampi un elenco. soup [0] sarà sufficiente per mostrare str invece che repr, mostrando il contenuto della stringa e non il modificatore di virgolette e unicode.
ironfroggy

2
Non dovresti codificare il testo rappresentato come Unicode in byte nella maggior parte dei casi: dovresti stampare Unicode direttamente in Python:print(', '.join([u'ABC' , u'...']))
jfs

26

Probabilmente hai un elenco contenente una stringa unicode. Il reprdi questo è [u'String'].

Puoi convertirlo in un elenco di stringhe di byte usando qualsiasi variazione di quanto segue:

# 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
Per favore, evita orrori come repr(x).lstrip('u')[1:-1]. Usa qualcosa del tipo: print ", ".join(my_list)invece, per formattare un elenco di stringhe Unicode.
jfs,

1
Il commento dice: "In realtà non è un buon modo di farlo". È qui solo per il lolz!
ddaa,

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

stamperà

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

1
questo metodo mi sembra abbastanza dolce, perché nessun voto? qualsiasi impatto sulle prestazioni di cui dovremmo preoccuparci?
jrich523,

8

Se si accede / stampa elenchi di singoli elementi (ad esempio, in sequenza o filtrati):

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

1
fai una comprensione della lista:my_list = [str(my_list[x]) for x in range(len(my_list))]
gevang,

4

passa l'output alla funzione str () e rimuoverà la conversione dell'output Unicode. inoltre stampando l'output rimuoverà i tag u '' da esso.


4

[u'String'] è una rappresentazione testuale di un elenco che contiene una stringa Unicode su Python 2.

Se lo esegui, print(some_list)allora è equivalente a
print'[%s]' % ', '.join(map(repr, some_list))ie, per creare una rappresentazione testuale di un oggetto Python con il tipo list, repr()viene chiamata la funzione per ogni elemento.

Non confondere un oggetto Python e la sua rappresentazione di testo - repr('a') != 'a'e anche la rappresentazione di testo delle differisce rappresentazione del testo: repr(repr('a')) != repr('a').

repr(obj)restituisce una stringa che contiene una rappresentazione stampabile di un oggetto. Il suo scopo è quello di essere una rappresentazione inequivocabile di un oggetto che può essere utile per il debug, in un REPL. Spesso eval(repr(obj)) == obj.

Per evitare di chiamare repr(), è possibile stampare direttamente gli elementi dell'elenco (se sono tutte stringhe Unicode), ad esempio: print ",".join(some_list)—stampa un elenco separato da virgole delle stringhe:String

Non codificare una stringa Unicode in byte utilizzando una codifica di caratteri codificata, stampare invece Unicode direttamente . In caso contrario, il codice potrebbe non riuscire perché la codifica non può rappresentare tutti i caratteri, ad esempio se si tenta di utilizzare la 'ascii'codifica con caratteri non ASCII. Oppure il codice produce silenziosamente mojibake (i dati danneggiati vengono passati ulteriormente in una pipeline) se l'ambiente utilizza una codifica incompatibile con la codifica codificata.


3

Usa diro typesulla "stringa" per scoprire di cosa si tratta. Sospetto che sia uno degli oggetti tag di BeautifulSoup, che viene stampato come una stringa, ma in realtà non lo è. Altrimenti, è all'interno di un elenco e devi convertire ogni stringa separatamente.

In ogni caso, perché ti opponi all'utilizzo di Unicode? Qualche motivo specifico?


Ho visto BeautifulSoup dagli ultimi giorni. Non riuscivo a capire come Gnuchu avrebbe ottenuto te ['string'] non [u'String ']. Il suo commento ad Andrew Jaffe sembra dimostrare che si tratta di un elenco.
Batbrat,

3

Intendi davvero u'String'?

In ogni caso, non puoi semplicemente fare str(string)una stringa piuttosto che una stringa unicode? (Questo dovrebbe essere diverso per Python 3, per il quale tutte le stringhe sono unicode.)


Avrei dovuto essere più chiaro. Sto usando str () ma sto ancora ottenendo un output come di seguito quando stampo. [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] I dati vengono rimossi come testo da una pagina web, quindi inseriti in un database (Google Appstore), quindi recuperati e stampati.
gnuchu,

-1

encode("latin-1") mi ha aiutato nel mio caso:

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

-1

Forse non capisco, perché non riesci a ottenere element.text e poi a convertirlo prima di usarlo? per esempio (non so perché lo faresti, ma ...) trova tutti gli elementi dell'etichetta della pagina web e itera tra loro fino a trovare uno chiamato MyText

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

Converti la stringa da I e fai quello che volevi fare ... forse mi sto perdendo qualcosa nel messaggio originale? o era quello che stavi cercando?


Ti manca la parte in cui si pone la domanda su come fare "Converti la stringa da i".
Nathan Tuggy,

ahhh, grazie a tutti i commenti pensavo che il problema fosse ottenere il valore da convertire
Steven,

ma per essere onesti i.text è il valore della stringa effettiva, non è necessario "estrarlo da un array" come alcuni hanno suggerito se l'etichetta elemet, ad esempio, ha un valore di testo di [u'String '] i.text sarà String
Steven
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.