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?
Réponses:
[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:
Cependant, veuillez vérifier que vos données sont bien ASCII. C'est assez rare. Beaucoup plus probable est latin-1 ou utf-8.
Ou vous demandez à Beautiful Soup quel était l'encodage d'origine et le récupérez dans cet encodage:
la source
print(', '.join([u'ABC' , u'...']))
Vous avez probablement une liste contenant une chaîne unicode. Le
repr
de 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:
la source
repr(x).lstrip('u')[1:-1]
. Utilisez quelque chose comme: à laprint ", ".join(my_list)
place, pour formater une liste de chaînes Unicode.va imprimer
la source
Si vous accédez / imprimez des listes d'éléments uniques (par exemple, séquentiellement ou filtrées):
la source
my_list = [str(my_list[x]) for x in range(len(my_list))]
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 ''.
la source
[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 typelist
, larepr()
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. Souventeval(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.la source
Utilisez
dir
outype
sur 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?
la source
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.)la source
encode("latin-1")
m'a aidé dans mon cas:la source
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
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?
la source