La cadena de Python se imprime como [u'String ']

142

Esto seguramente será fácil pero realmente me está molestando.

Tengo un script que se lee en una página web y usa Beautiful Soup para analizarlo. De la sopa extraigo todos los enlaces, ya que mi objetivo final es imprimir el contenido del enlace.

Todo el texto que estoy analizando es ASCII. Sé que Python trata las cadenas como unicode, y estoy seguro de que esto es muy útil, simplemente inútil en mi pequeño script.

Cada vez que voy a imprimir una variable que contiene 'Cadena' me [u'String']imprimen en la pantalla. ¿Hay una manera simple de volver a poner esto en ascii o debería escribir una expresión regular para quitarlo?

gnuchu
fuente
posible duplicado de la pregunta (y respuesta) mucho más claramente redactadas: stackoverflow.com/q/2464959/1390788
Terrabits
¿Responde esto a tu pregunta? ¿Cuál es el prefijo u en una cadena de Python?
Terrabits

Respuestas:

118

[u'ABC']sería una lista de un elemento de cadenas unicode. Beautiful Soup siempre produce Unicode . Por lo tanto, debe convertir la lista en una sola cadena Unicode y luego convertirla a ASCII.

No sé exactamente cómo obtuviste las listas de un elemento; el miembro de contenido sería una lista de cadenas y etiquetas, que aparentemente no es lo que tiene. Suponiendo que realmente siempre obtienes una lista con un solo elemento, y que tu prueba es realmente solo ASCII, usarías esto:

 soup[0].encode("ascii")

Sin embargo, verifique que sus datos sean realmente ASCII. Esto es bastante raro. Es mucho más probable que sea latin-1 o utf-8.

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


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

O le preguntas a Beautiful Soup cuál era la codificación original y la recuperas en esta codificación:

 soup[0].encode(soup.originalEncoding)
oefe
fuente
66
En realidad, no tiene que hacer la codificación, porque el OP solo está viendo la reproducción de la cadena porque así es como ve algo cuando imprime una lista. soup [0] será suficiente para mostrar la cadena en lugar de la repr, mostrando el contenido de la cadena y no el modificador de comillas y unicode.
ironfroggy
2
No debe codificar el texto representado como Unicode en bytes en la mayoría de los casos: debe imprimir Unicode directamente en Python:print(', '.join([u'ABC' , u'...']))
jfs
26

Probablemente tenga una lista que contiene una cadena Unicode. El reprde esto es [u'String'].

Puede convertir esto en una lista de cadenas de bytes utilizando cualquier variación de lo siguiente:

# 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)
ddaa
fuente
1
Por favor, evite los horrores como repr(x).lstrip('u')[1:-1]. Use algo como: en su print ", ".join(my_list)lugar, para formatear una lista de cadenas Unicode.
jfs
1
El comentario dice: "Esa no es una buena forma de hacerlo". ¡Solo está aquí para los lolz!
ddaa
9
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

imprimirá

{'name': 'A', 'primary_key': 1}
osmjit
fuente
1
Este método me parece muy dulce, ¿por qué no hay votos? ¿Hay algún impacto en el rendimiento del que debamos preocuparnos?
jrich523
8

Si accede / imprime listas de elementos individuales (p. Ej., Secuencialmente o filtradas):

my_list = [u'String'] # sample element
my_list = [str(my_list[0])]
gevang
fuente
1
haces una lista de comprensión:my_list = [str(my_list[x]) for x in range(len(my_list))]
gevang
4

pase la salida a la función str () y eliminará la conversión de la salida unicode. También imprimiendo el resultado eliminará las etiquetas u '' de él.

Waweru
fuente
4

[u'String'] es una representación de texto de una lista que contiene una cadena Unicode en Python 2.

Si ejecuta print(some_list), es equivalente a
print'[%s]' % ', '.join(map(repr, some_list)), es decir, crear una representación de texto de un objeto Python con el tipo list, repr()se llama a la función para cada elemento.

No se debe confundir un objeto Python y su representación de texto - repr('a') != 'a'e incluso la representación de texto de los difiere de representación de texto: repr(repr('a')) != repr('a').

repr(obj)devuelve una cadena que contiene una representación imprimible de un objeto. Su propósito es ser una representación inequívoca de un objeto que pueda ser útil para la depuración, en un REPL. A menudo eval(repr(obj)) == obj.

Para evitar llamadas repr(), puede imprimir elementos de la lista directamente (si son todas cadenas Unicode), por ejemplo: print ",".join(some_list)—imprime una lista separada por comas de las cadenas:String

No codifique una cadena Unicode en bytes utilizando una codificación de caracteres codificada, imprima Unicode directamente en su lugar. De lo contrario, el código puede fallar porque la codificación no puede representar todos los caracteres, por ejemplo, si intenta utilizar la 'ascii'codificación con caracteres no ASCII. O el código produce silenciosamente mojibake (los datos corruptos se pasan más lejos en una tubería) si el entorno usa una codificación que es incompatible con la codificación codificada.

jfs
fuente
3

Use diro typeen la 'cadena' para averiguar qué es. Sospecho que es uno de los objetos de etiqueta de BeautifulSoup, que se imprime como una cadena, pero realmente no es uno. De lo contrario, está dentro de una lista y debe convertir cada cadena por separado.

En cualquier caso, ¿por qué se opone a usar Unicode? ¿Alguna razón específica?

sykora
fuente
He estado mirando BeautifulSoup desde los últimos días. No pude entender cómo gnuchu obtendría u ['string'] no [u'String ']. Su comentario a Andrew Jaffe parece demostrar que es una lista.
Batbrat
3

¿De verdad quieres decir? u'String' ?

En cualquier caso, ¿no puede simplemente str(string)obtener una cadena en lugar de una cadena Unicode? (Esto debería ser diferente para Python 3, para el cual todas las cadenas son unicode).

Andrew Jaffe
fuente
Debería haber sido más claro. Estoy usando str () pero todavía obtengo resultados como a continuación cuando imprimo. [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] Los datos se eliminan como texto de una página web, luego se insertan en una base de datos (Google Appstore), luego se recuperan e imprimen.
gnuchu 01 de
-1

encode("latin-1") me ayudó en mi caso:

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

Tal vez no entiendo, ¿por qué no puede obtener el element.text y luego convertirlo antes de usarlo? por ejemplo (no sé por qué haría esto, pero ...) encuentre todos los elementos de etiqueta de la página web e itere entre ellos hasta encontrar uno llamado MyText

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

Convierta la cadena de i y haga lo que quiera hacer ... ¿tal vez me falta algo en el mensaje original? o era esto lo que estabas buscando?

Steven
fuente
Te estás perdiendo la parte donde la pregunta es sobre cómo hacer "Convertir la cadena de i".
Nathan Tuggy
ahhh, gracias por todos los comentarios, pensé que el problema era obtener el valor para convertir
Steven
pero para ser justos, i.text es el valor de cadena real, no hay necesidad de "extraerlo de una matriz", como sugirieron algunas personas si la etiqueta elemet, por ejemplo, tiene un valor de texto de [u'String '] i.text será String
Steven