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


142

这肯定是一件容易的事,但这确实困扰着我。

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

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

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


措辞更清晰的问题(和答案)的可能重复:stackoverflow.com/q/2464959/1390788
Terrabits

这回答了你的问题了吗?Python字符串中的u前缀是什么?
Terrabits

Answers:


118

[u'ABC']将是一元字符串的unicode字符串。美丽的汤总是产生Unicode。因此,您需要将列表转换为单个unicode字符串,然后将其转换为ASCII。

我不知道您是如何得到一元素清单的;content成员将是字符串和标签的列表,这显然不是您所拥有的。假设您确实总是得到一个包含单个元素的列表,并且您的测试实际上仅是 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)

6
实际上,您不必进行编码,因为OP仅看到字符串repr,因为这就是您在打印列表时看到的内容。soup [0]足以显示str而不是repr,它显示字符串的内容,而不是quote和unicode修饰符。
ironfroggy

2
在大多数情况下,您不应该将表示Unicode的文本编码为字节:您应该直接在Python中打印Unicode:print(', '.join([u'ABC' , u'...']))
jfs

26

您可能有一个包含一个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)

1
请避免发生诸如此类的恐怖repr(x).lstrip('u')[1:-1]。使用类似:的print ", ".join(my_list)格式来格式化Unicode字符串列表。
jfs

1
评论说:“这实际上不是一个好方法”。就在这里,哈哈!
ddaa

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

将打印

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

1
这种方法对我来说看起来很甜蜜,为什么不投票呢?我们应该担心的任何性能影响?
jrich523

8

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

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

1
您进行列表理解:my_list = [str(my_list[x]) for x in range(len(my_list))]
gevang

4

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


4

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

如果运行print(some_list),则相当于
print'[%s]' % ', '.join(map(repr, some_list))创建类型为的Python对象的文本表示形式listrepr()即为每个项目调用函数。

请勿混淆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字符使用编码。或者,如果环境使用的编码与硬编码的编码不兼容,则代码会默默地产生mojibake(在管道中进一步传递损坏的数据)。


3

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

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


最近几天以来,我一直在看BeautifulSoup。我不知道gnuchu怎么会得到u ['string']而不是[u'String']。他对Andrew Jaffe的评论似乎证明了它是一个清单。
batbrat

3

你是真的意思u'String'

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


我应该更清楚了。我正在使用str(),但在打印时仍会得到如下输出。[u'ABC'] [u'DEF'] [u'GHI'] [u'JKL']将数据从网页上剥离为文本,然后插入数据库(Google Appstore),然后进行检索和打印。
gnuchu

-1

encode("latin-1") 就我而言对我有帮助:

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

-1

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

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

从i转换字符串,然后执行您想做的任何事情……也许我在原始消息中缺少了什么?还是这是您想要的?


您缺少有关如何执行“从i转换字符串” 问题的部分。
内森·塔吉

嗯,感谢所有评论,我认为问题在于获取转换的价值
史蒂文(Steven)

但是公平地说,i.text是实际的字符串值,因此无需像有人建议的那样将其“拉出数组”,例如,标签elemet的文本值为[u'String'] i.text将是弦乐
史蒂文(Steven)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.