web-dev-qa-db-fra.com

Python chaîne est imprimée sous la forme [u'String ']

Ce sera sûrement facile, mais cela me dérange vraiment.

J'ai un script qui lit dans une page Web et utilise Beautiful Soup pour l'analyser. De la soupe , j'extrais tous les liens, mon objectif final étant d'imprimer les liens.contenu.

Tout le texte que j'analyse est au format ASCII. Je sais que Python traite les chaînes de caractères comme unicode, et je suis certain que cela est très pratique, tout simplement inutile dans mon petit script.

Chaque fois que je vais imprimer une variable contenant "String", je reçois [u'String'] imprimé à l'écran. Existe-t-il un moyen simple de récupérer cette information dans ascii ou devrais-je écrire une regex pour la supprimer?

127
gnuchu

[u'ABC'] serait une liste à un élément de chaînes unicode. Beautiful Soup produit toujours Unicode . Vous devez donc convertir la liste en une seule chaîne unicode, puis la convertir en ASCII.

Je ne sais pas exactement comment vous avez obtenu les listes à un élément. le membre de contenu serait une liste de chaînes et de balises, ce qui n'est apparemment pas ce que vous avez. En supposant que vous obteniez toujours une liste avec un seul élément et que votre test soit vraiment uniquement ASCII, vous utiliseriez ceci:

 soup[0].encode("ascii")

Cependant, veuillez vérifier que vos données sont vraiment ASCII. C'est assez rare. Beaucoup plus probable que ce soit latin-1 ou utf-8.

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


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

Ou vous demandez à Beautiful Soup quel était l'encodage d'origine et le récupérez dans cet encodage:

 soup[0].encode(soup.originalEncoding)
108
oefe

Vous avez probablement une liste contenant une chaîne Unicode. La repr de ceci est [u'String'].

Vous pouvez convertir cela en une liste de chaînes d'octets en utilisant l'une des variantes suivantes:

# 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)
24
ddaa
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

imprimera

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

Si vous accédez/imprimez des listes d'éléments uniques (par exemple, séquentiellement ou filtrées):

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

passez la sortie à la fonction str () et supprimera la conversion de la sortie unicode. également en imprimant la sortie, il en supprimera les "u".

4
waweru

[u'String'] est une représentation textuelle d'une liste contenant une chaîne Unicode sur Python 2.

Si vous exécutez print(some_list), cela équivaut à
print'[%s]' % ', '.join(map(repr, some_list)) c'est-à-dire, pour créer une représentation textuelle d'un objet Python avec le type list, repr() est appelée pour chaque élément.

Ne confondez pas un objet Python et sa représentation textuellerepr('a') != 'a' et même la représentation textuelle de la représentation textuelle diffère: repr(repr('a')) != repr('a').

repr(obj) renvoie une chaîne contenant une représentation imprimable d'un objet. Son but est d'être une représentation non ambiguë d'un objet pouvant être utile pour le débogage, dans un REPL. Souvent eval(repr(obj)) == obj.

Pour éviter d'appeler repr(), vous pouvez imprimer directement les éléments de la liste (s'il s'agit de chaînes Unicode), par exemple: print ",".join(some_list)— pour afficher une liste des chaînes séparées par des virgules: String

Ne codez pas une chaîne Unicode en octets à l'aide d'un codage de caractères codé en dur, affichez directement Unicode. Sinon, le code peut échouer car l'encodage ne peut pas représenter tous les caractères, par exemple, si vous essayez d'utiliser l'encodage 'ascii' avec des caractères non ascii. Ou bien le code produit silencieusement mojibake (les données corrompues sont transférées dans un pipeline) si l'environnement utilise un codage incompatible avec le codage en dur.

2
jfs

Voulez-vous vraiment dire u'String'?

Dans tous les cas, ne pouvez-vous pas simplement utiliser str(string) pour obtenir une chaîne plutôt qu'une chaîne unicode? (Cela devrait être différent pour Python 3, pour lequel toutes les chaînes sont unicode.)

2
Andrew Jaffe

Utilisez dir ou type sur la 'chaîne' pour savoir ce que c'est. Je suppose que c'est l'un des objets de balise de BeautifulSoup, qui s'imprime comme une chaîne, mais n'en est pas une. Sinon, il se trouve dans une liste et vous devez convertir chaque chaîne séparément.

Dans tous les cas, pourquoi vous opposez-vous à l’utilisation de l’Unicode? Une raison spécifique?

2
sykora