这肯定会很容易,但它真的让我很烦。
我有一个在网页中读取并使用Beautiful Soup解析它的脚本。我从汤中提取所有链接,因为我的最终目标是打印出链接内容。
我正在解析的所有文本都是 ASCII。我知道 Python 将字符串视为 unicode,我相信这非常方便,只是在我的小脚本中没有用。
每次我打印出一个包含“字符串”的变量时,我都会[u'String']
打印到屏幕上。有没有一种简单的方法可以将其恢复为 ascii 或者我应该编写一个正则表达式来剥离它?
这肯定会很容易,但它真的让我很烦。
我有一个在网页中读取并使用Beautiful Soup解析它的脚本。我从汤中提取所有链接,因为我的最终目标是打印出链接内容。
我正在解析的所有文本都是 ASCII。我知道 Python 将字符串视为 unicode,我相信这非常方便,只是在我的小脚本中没有用。
每次我打印出一个包含“字符串”的变量时,我都会[u'String']
打印到屏幕上。有没有一种简单的方法可以将其恢复为 ascii 或者我应该编写一个正则表达式来剥离它?
[u'ABC']
将是 unicode 字符串的单元素列表。Beautiful Soup 总是产生 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)
您可能有一个包含一个 unicode 字符串的列表。这repr
是[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)
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r))
将打印
{'name': 'A', 'primary_key': 1}
如果访问/打印单个元素列表(例如,顺序或过滤):
my_list = [u'String'] # sample element
my_list = [str(my_list[0])]
将输出传递给 str() 函数,它将删除 unicode 输出 u''。同样通过打印输出,它会从中删除 u'' 标签。
[u'String']
是包含 Python 2 上的 Unicode 字符串的列表的文本表示形式。
如果你运行,print(some_list)
那么它相当于
print'[%s]' % ', '.join(map(repr, some_list))
ie,创建一个 Python 对象的文本表示,它的类型为list
,repr()
为每个项目调用函数。
不要混淆 Python 对象及其文本表示—<code>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 字符使用编码。或者,如果环境使用与硬编码不兼容的编码,则代码会静默生成 mojibake(损坏的数据在管道中进一步传递)。
你真的是这个意思u'String'
吗?
无论如何,您不能只str(string)
获取字符串而不是 unicode 字符串吗?(这对于 Python 3 应该是不同的,所有字符串都是 unicode。)
在“字符串”上使用dir
或type
找出它是什么。我怀疑它是 BeautifulSoup 的标记对象之一,它像字符串一样打印,但实际上不是。否则,它在一个列表中,您需要分别转换每个字符串。
无论如何,您为什么反对使用 Unicode?有什么具体原因吗?
encode("latin-1")
在我的情况下帮助了我:
facultyname[0].encode("latin-1")