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?
Respuestas:
[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:
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.
O le preguntas a Beautiful Soup cuál era la codificación original y la recuperas en esta codificación:
fuente
print(', '.join([u'ABC' , u'...']))
Probablemente tenga una lista que contiene una cadena Unicode. El
repr
de esto es[u'String']
.Puede convertir esto en una lista de cadenas de bytes utilizando cualquier variación de lo siguiente:
fuente
repr(x).lstrip('u')[1:-1]
. Use algo como: en suprint ", ".join(my_list)
lugar, para formatear una lista de cadenas Unicode.imprimirá
fuente
Si accede / imprime listas de elementos individuales (p. Ej., Secuencialmente o filtradas):
fuente
my_list = [str(my_list[x]) for x in range(len(my_list))]
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.
fuente
[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 aprint'[%s]' % ', '.join(map(repr, some_list))
, es decir, crear una representación de texto de un objeto Python con el tipolist
,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 menudoeval(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.fuente
Use
dir
otype
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 debe convertir cada cadena por separado.En cualquier caso, ¿por qué se opone a usar Unicode? ¿Alguna razón específica?
fuente
¿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).fuente
encode("latin-1")
me ayudó en mi caso:fuente
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
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?
fuente