Python字符串打印为[u'String']

时间:2009-03-01 10:48:46

标签: python unicode ascii

这肯定是一件容易的事,但这真的让我烦恼。

我有一个脚本可以读入网页并使用Beautiful Soup来解析它。从我提取所有链接,因为我的最终目标是打印出link.contents。

我正在解析的所有文本都是ASCII。我知道Python将字符串视为unicode,我确信这非常方便,只是在我的小脚本中没用。

每次我打印出一个包含'String'的变量时,我都会在屏幕上打印[u'String']。是否有一种简单的方法可以将其恢复为ascii,还是应该编写正则表达式来删除它?

10 个答案:

答案 0 :(得分:101)

[u'ABC']将是unicode字符串的单元素列表。 Beautiful Soup always produces Unicode。因此,您需要将列表转换为单个unicode字符串,然后将其转换为ASCII。

我不知道你是如何获得单元素列表的;内容成员将是一个字符串和标签列表,这显然不是你拥有的。假设你总是得到一个包含单个元素的列表,并且你的测试实际上只是 ASCII,你可以使用它:

 soup[0].encode("ascii")

但是,请仔细检查您的数据是否真的是ASCII。这非常罕见。更有可能是latin-1或utf-8。

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


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

或者你问Beautiful Soup原始编码是什么,并以此编码取回:

 soup[0].encode(soup.originalEncoding)

答案 1 :(得分:21)

您可能有一个包含一个unicode字符串的列表。 repr的{​​{1}}为[u'String']

您可以使用以下任何变体将其转换为字节字符串列表:

# 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)

答案 2 :(得分:7)

如果访问/打印单个元素列表(例如,顺序或过滤):

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

答案 3 :(得分:6)

import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

将打印

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

答案 4 :(得分:4)

将输出传递给str()函数,它将删除转换unicode输出。 通过打印输出,它将从中删除u''标签。

答案 5 :(得分:2)

你的意思是u'String'吗?

无论如何,你不能只是str(string)来获取字符串而不是unicode字符串吗? (对于Python 3,这应该是不同的,所有字符串都是unicode。)

答案 6 :(得分:2)

[u'String']是包含Python 2上的Unicode字符串的列表的文本表示。

如果您运行print(some_list),那么它相当于
print'[%s]' % ', '.join(map(repr, some_list))即,要创建类型为list的Python对象的文本表示,请为每个项调用repr()函数。

不要混淆Python对象及其文本表示 - repr('a') != 'a',甚至文本表示的文本表示也不同:repr(repr('a')) != repr('a')

repr(obj)返回一个字符串,其中包含对象的可打印表示形式。它的目的是成为一个对象的明确表示,它可以在REPL中用于调试。经常eval(repr(obj)) == obj

为了避免调用repr(),您可以直接打印列表项(如果它们都是Unicode字符串),例如:print ",".join(some_list) - 它会打印逗号分隔的字符串列表:String < / p>

不要使用硬编码字符编码将Unicode字符串编码为字节,而是直接打印Unicode 。否则,代码可能会失败,因为编码无法表示所有字符,例如,如果您尝试将'ascii'编码与非ascii字符一起使用。或者,如果环境使用与硬编码编码不兼容的编码,代码将以静默方式生成mojibake(损坏的数据在管道中进一步传递)。

答案 7 :(得分:1)

在'字符串'上使用dirtype来了解它是什么。我怀疑它是BeautifulSoup的标签对象之一,打印得像一个字符串,但实际上不是一个。否则,它在列表中,你需要单独转换每个字符串。

无论如何,你为什么反对使用Unicode?有什么特别的原因吗?

答案 8 :(得分:-1)

在我的案例中,

encode("latin-1")帮助了我:

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

答案 9 :(得分:-1)

也许我不明白,为什么你不能得到element.text然后在使用之前转换它? 例如(不知道为什么你会这样做,但......) 找到网页的所有标签元素并在它们之间进行迭代,直到找到一个名为MyText

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

从i转换字符串并做任何你想做的事情...... 也许我错过了原始邮件中的内容? 或者这就是你要找的东西?