Python 字符串打印为[ u‘ String’]

这肯定是一个容易的问题,但它确实困扰着我。

我有一个脚本,读入一个网页,并使用 靓汤解析它。我从 中提取所有的链接,因为我的最终目标是打印出 link.content。

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

每次我打印出一个包含字符串的变量时,我都会将 [u'String']打印到屏幕上。有没有一种简单的方法可以将它返回到 ascii 或者我应该编写一个 regex 来剥离它?

291250 次浏览

你真的是指 u'String'吗?

在任何情况下,您不能只用 str(string)来获取字符串而不是 unicode-string 吗?(对于 Python3,所有字符串都是 unicode,这应该是不同的。)

在“字符串”上使用 dirtype找出它是什么。我怀疑这是 BeautifulSoup 的标签对象之一,它像字符串一样打印,但实际上不是字符串。否则,它在一个列表中,您需要分别转换每个字符串。

无论如何,你为什么反对使用 Unicode? 有什么具体原因吗?

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

我不知道具体是如何得到单元素列表的; content 成员将是一个由字符串和标记组成的列表,这显然不是您所拥有的。假设您总是得到一个包含单个元素的列表,并且您的测试实际上是 只有 ASCII,您将使用以下方法:

 soup[0].encode("ascii")

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

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




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

或者你问靓汤公司最初的编码是什么,然后得到这个编码:

 soup[0].encode(soup.originalEncoding)

您可能有一个包含一个 unicode 字符串的列表。

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

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

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

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

将输出传递给 str ()函数,它将删除 unicode 输出 u”。 也通过打印输出,它将删除从它的 u”标签。

encode("latin-1")在我的案例中帮助了我:

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

[u'String']是在 Python2上包含 Unicode 字符串的列表的文本表示形式。

如果运行 print(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

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

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

将打印

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