La chaîne Python s'imprime sous la forme [u'String ']

142

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

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

Tout le texte que j'analyse est ASCII. Je sais que Python traite les chaînes comme unicode, et je suis sûr que c'est très pratique, tout simplement inutile dans mon petit script.

Chaque fois que je vais imprimer une variable qui contient «String», je suis [u'String']imprimé à l'écran. Existe-t-il un moyen simple de remettre cela en ASCII ou devrais-je écrire une regex pour le supprimer?

gnuchu
la source
duplicata possible de la question (et de la réponse) beaucoup plus clairement formulée: stackoverflow.com/q/2464959/1390788
Terrabits
Est-ce que cela répond à votre question? Quel est le préfixe u dans une chaîne Python?
Terrabits le

Réponses:

118

[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 obtenez toujours une liste avec un seul élément et que votre test est vraiment uniquement ASCII, vous utiliseriez ceci:

 soup[0].encode("ascii")

Cependant, veuillez vérifier que vos données sont bien ASCII. C'est assez rare. Beaucoup plus probable est 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)
oefe
la source
6
En fait, vous n'avez pas à faire l'encodage, car l'OP ne voit que la chaîne repr parce que c'est comme ça que vous voyez quoi que ce soit lorsque vous imprimez une liste. soup [0] sera suffisant pour afficher le str au lieu du repr, montrant le contenu de la chaîne et non le modificateur quote et unicode.
ironfroggy
2
Vous ne devez pas encoder le texte représenté en Unicode en octets dans la plupart des cas: vous devez imprimer Unicode directement en Python:print(', '.join([u'ABC' , u'...']))
jfs
26

Vous avez probablement une liste contenant une chaîne unicode. Le reprde ceci est [u'String'].

Vous pouvez le convertir en une liste de chaînes d'octets en utilisant n'importe quelle variante de ce qui suit:

# 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
la source
1
S'il vous plaît, évitez des horreurs telles que repr(x).lstrip('u')[1:-1]. Utilisez quelque chose comme: à la print ", ".join(my_list)place, pour formater une liste de chaînes Unicode.
jfs
1
Le commentaire, il dit: "Ce n'est en fait pas une bonne façon de le faire". C'est juste ici pour les lolz!
ddaa
9
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

va imprimer

{'name': 'A', 'primary_key': 1}
osmjit
la source
1
cette méthode me semble assez douce, pourquoi pas de votes? tout impact sur les performances dont nous devrions nous préoccuper?
jrich523
8

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])]
gevang
la source
1
vous faites une liste de compréhension:my_list = [str(my_list[x]) for x in range(len(my_list))]
gevang
4

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

Waweru
la source
4

[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)alors c'est équivalent à
print'[%s]' % ', '.join(map(repr, some_list))ie, pour créer une représentation textuelle d'un objet Python avec le type list, la repr()fonction est appelée pour chaque élément.

Ne confondez pas un objet Python et sa représentation de texte - repr('a') != 'a'et même la représentation textuelle des diffère de représentation du texte: 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 sans ambiguïté d'un objet qui peut être utile pour le débogage, dans une REPL. Souvent eval(repr(obj)) == obj.

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

N'encodez pas une chaîne Unicode en octets à l'aide d'un codage de caractères codé en dur, imprimez directement Unicode à la place. 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' 'ascii'encodage avec des caractères non-ascii. Ou le code produit silencieusement mojibake (les données corrompues sont transmises plus loin dans un pipeline) si l'environnement utilise un codage incompatible avec le codage codé en dur.

jfs
la source
3

Utilisez dirou typesur la «chaîne» pour savoir ce que c'est. Je soupçonne que c'est l'un des objets tag de BeautifulSoup, qui s'imprime comme une chaîne, mais qui n'en est vraiment pas un. Sinon, c'est dans une liste et vous devez convertir chaque chaîne séparément.

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

sykora
la source
Je regarde BeautifulSoup depuis ces derniers jours. Je ne pouvais pas comprendre comment gnuchu obtiendrait u ['string'] pas [u'String ']. Son commentaire à Andrew Jaffe semble prouver qu'il s'agit d'une liste.
batbrat
3

Voulez-vous vraiment dire u'String'?

Dans tous les cas, ne pouvez-vous pas simplement str(string)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.)

Andrew Jaffe
la source
J'aurais du être plus clair. J'utilise str () mais j'obtiens toujours une sortie comme ci-dessous lorsque j'imprime. [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] Les données sont supprimées sous forme de texte d'une page Web, puis insérées dans une base de données (Google Appstore), puis récupérées et imprimées.
gnuchu
-1

encode("latin-1") m'a aidé dans mon cas:

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

Peut-être que je ne comprends pas, pourquoi ne pouvez-vous pas simplement obtenir l'élément.text, puis le convertir avant de l'utiliser? par exemple (je ne sais pas pourquoi vous feriez cela mais ...) trouvez tous les éléments d'étiquette de la page Web et parcourez entre eux jusqu'à ce que vous en trouviez un appelé MyText

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

Convertissez la chaîne de i et faites ce que vous vouliez faire ... peut-être que je manque quelque chose dans le message d'origine? ou était-ce ce que vous recherchiez?

Steven
la source
Il vous manque la partie où la question est de savoir comment faire "Convertir la chaîne de i".
Nathan Tuggy
ahhh, merci de tous les commentaires, je pensais que le problème était d'obtenir la valeur à convertir
Steven
mais pour être juste i.text est la valeur réelle de la chaîne, il n'est pas nécessaire de "la sortir d'un tableau" comme certains l'ont suggéré si l'élémet d'étiquette par exemple a une valeur textuelle de [u'String '] i.text sera String
Steven