2009-03-01 11 views
96

Esto seguramente será fácil, pero realmente me está molestando.La cadena de Python se imprime como [u'String ']

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 archivo link.contents.

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, de nada sirve en mi script wee.

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

Respuesta

82

[u'ABC'] sería una lista de un elemento de cadenas Unicode. Beautiful Soup always produces Unicode. Por lo tanto, debe convertir la lista en una única cadena Unicode y luego convertirla en ASCII.

No sé exactamente cómo se obtuvieron las listas de un elemento; el miembro del contenido sería una lista de cadenas y etiquetas, que aparentemente no es lo que tienes. Suponiendo que realmente siempre se obtiene una lista con un solo elemento, y que la prueba es realmente única ASCII que usaría esto:

soup[0].encode("ascii") 

Sin embargo, por favor, compruebe que sus datos son 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 Hermosa sopa de lo que fue la codificación original y ponerlo de nuevo en esta codificación:

soup[0].encode(soup.originalEncoding) 
+0

Brillante. Gracias. Disculpas por el error tipográfico – gnuchu

+6

En realidad, no tiene que hacer la codificación, porque el OP solo está viendo la repetición de cadena porque así es como ve algo cuando imprime una lista.soup [0] será suficiente para mostrar str en lugar de 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' ... '])) '] (http://stackoverflow.com/a/36891685/4279) – jfs

1

¿Realmente quiere decir u'String'?

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

+0

Debería haber sido más claro. Estoy usando str() pero aún obtengo el resultado siguiente cuando imprimo. [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] Los datos se despojó como texto de una página web, a continuación, se inserta en una base de datos (Google Appstore) , luego recuperado e impreso. – gnuchu

0

Use dir o type en 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 necesita convertir cada cadena por separado.

En cualquier caso, ¿por qué se opone al uso de Unicode? ¿Alguna razón específica?

+0

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

+0

+1 para enseñarle a pescar en lugar de atrapar un pez y dárselo. – batbrat

18

es probable que tenga una lista que contiene una cadena Unicode. El repr de esto es [u'String'].

Puede convertir esta a una lista de cadenas de bytes usando cualquier variación de los siguientes:

# 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) 
+4

comprensión de la lista para la victoria – Jimmy

+1

Por favor, evite horrores tales como' repr (x) .lstrip ('u') [1: -1] '. Use algo como: 'print '','join (my_list)' en su lugar, para formatear una lista de cadenas Unicode. – jfs

+1

El comentario, dice: "Esa no es una buena manera de hacerlo". ¡Está aquí para el lolz! – ddaa

6

Si las listas de acceso/impresión solo elemento (por ejemplo, o filtrada secuencialmente):

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

¿Qué pasa si 'my_list = [u'String ', u'String', u'String ', u'String']' se parece a esto ... –

+1

haces una lista de comprensión: 'my_list = [str (mi_lista [x ]) para x en rango (len (my_list))] ' – gevang

4

pase la salida a la función str() y eliminará la conversión de la salida de Unicode. también al imprimir la salida eliminará las etiquetas 'u' 'de la misma.

-1

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

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

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

Si ejecuta print(some_list) entonces es equivalente a
print'[%s]' % ', '.join(map(repr, some_list)) es decir, para crear una representación de texto de un objeto Python con el tipo list, se llama a la función repr() 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 la representación de texto difiere: repr(repr('a')) != repr('a').

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

Para evitar llamar repr(), podría imprimir directamente elementos de la lista (si es que son todas las cadenas Unicode), por ejemplo: print ",".join(some_list) -es imprime una lista separada por comas de las cuerdas: String

No te codificar una cadena Unicode de bytes utilizando una codificación de caracteres codificados, imprime 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 codificación 'ascii' con caracteres que no sean ASCII. O el código produce silenciosamente mojibake (los datos corruptos se pasan más allá en una interconexión) si el entorno usa una codificación que es incompatible con la codificación codificada.

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

imprimirá

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

este método me parece muy dulce, ¿por qué no hay votos? cualquier impacto en el rendimiento que debería preocuparnos? – jrich523

-1

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

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

convertir la cadena de i y hacer lo Quería hacer ... tal vez me falta algo en el mensaje original? o era esto lo que estabas buscando?

+0

Te estás perdiendo la parte donde está la pregunta * sobre * cómo hacer "Convertir la cadena de i". –

+0

ahhh, gracias por todos los comentarios que pensé que el problema era obtener el valor para convertir – Steven

+0

, pero para ser justos i.text es el valor real de la cadena, no hay necesidad de "sacarlo 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

Cuestiones relacionadas