La cadena Python se imprime como

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 objective final es imprimir los enlaces.

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, pero no sirve de nada en mi pequeño script.

Cada vez que voy a imprimir una variable que contiene ‘Cadena’, [u'String'] en la pantalla. ¿Hay una forma sencilla de volver a convertir esto en solo ascii o debo escribir una expresión regular para eliminarlo?

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

No sé exactamente cómo obtuviste las listas de un elemento; el miembro del contenido sería una lista de cadenas y tags, que aparentemente no es lo que tienes. Suponiendo que realmente siempre obtenga una lista con un solo elemento, y que su prueba sea solo ASCII, usaría esto:

  soup[0].encode("ascii") 

Sin embargo, compruebe 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 encoding original y la recuperas en esta encoding:

  soup[0].encode(soup.originalEncoding) 

Probablemente tengas una lista que contiene una cadena Unicode. La repr de esto es [u'String'] .

Puede convertir esto en una lista de cadenas de bytes usando 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) 

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

 my_list = [u'String'] # sample element my_list = [str(my_list[0])] 
 import json, ast r = {u'name': u'A', u'primary_key': 1} ast.literal_eval(json.dumps(r)) 

imprimirá

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

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 tags u ” de ella.

¿De verdad te refieres a u'String' ?

En cualquier caso, ¿no puedes simplemente hacer str(string) para 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).

[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 la list tipos, se llama a la función repr() para cada elemento.

No confunda un objeto de Python con su representación de texto : repr('a') != 'a' e incluso la representación de texto de la representación del texto es diferente: 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 llamar a repr() , puede imprimir los elementos de la lista directamente (si son todas las cadenas Unicode), por ejemplo: print ",".join(some_list) imprime una lista de cadenas separadas por comas: String

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

Use dir o type en la ‘cadena’ para averiguar qué es. Sospecho que es uno de los objetos etiquetados de BeautifulSoup, que se imprime como una cadena, pero en realidad no lo es. De lo contrario, está dentro de una lista y necesita convertir cada cadena por separado.

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

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

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

Tal vez no lo entiendo, ¿por qué no puedes 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 la etiqueta de la página web e itérelos entre ellos hasta que encuentre uno llamado MiTexto

  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 … ¿quizás me esté perdiendo algo en el mensaje original? ¿O era esto lo que estabas buscando?