2009-03-01 95 views
96

这将肯定是一个容易的,但它真的让我烦恼。Python字符串打印为[u'String']

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

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

每当我打印出一个包含'String'的变量时,我都会将[u'String']打印到屏幕上。有没有一种简单的方法可以让我们回到ascii或者我应该写一个正则表达式去除它?

回答

82

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

我不知道你是如何得到单元素列表的;内容成员将是一个字符串和标签列表,这显然不是你所拥有的。假设你真的总是一个列表与一个单一的元素,并且您的测试真的只有 ASCII你这样做:

soup[0].encode("ascii") 

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

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


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

或者你问美丽汤什么原始编码是得到它回来了,这编码:

soup[0].encode(soup.originalEncoding) 
+0

辉煌。谢谢。对于错字的道歉。 – gnuchu 2009-03-01 12:15:38

+6

你实际上不需要进行编码,因为OP只能看到字符串repr,因为这就是当你打印一个列表时你看到什么东西。汤[0]将足以显示str而不是repr,显示字符串的内容而不是引用和unicode修饰符。 – ironfroggy 2009-03-01 13:36:57

+2

在大多数情况下,您不应将Unicode表示为Unicode的文本编码为字节:您应该直接在Python中打印Unicode:[`print(','.join([u'ABC',u'...'])) `](http://stackoverflow.com/a/36891685/4279) – jfs 2016-06-12 17:20:42

1

您的意思是u'String'

无论如何,你不能只是做str(string)得到一个字符串,而不是一个unicode字符串? (对Python 3来说,这应该是不同的,所有的字符串都是unicode。)

+0

我应该更清楚。我正在使用str(),但在打印时仍然会获得如下所示的输出。 [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] 的数据被作为汽提从网页文本,然后插入到数据库(谷歌的Appstore) ,然后检索并打印。 – gnuchu 2009-03-01 11:09:13

0

在'string'上使用dirtype来找出它是什么。我怀疑它是BeautifulSoup的标记对象之一,打印出来就像一个字符串,但实际上并不是一个。否则,它在一个列表中,你需要分别转换每个字符串。

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

+0

自从最近几天以来,我一直在寻找BeautifulSoup。我无法弄清楚gnuchu会如何让['string']不是[u'String']。他对安德鲁贾菲的评论似乎证明它是一个列表。 – batbrat 2009-03-01 11:54:02

+0

+1教他钓鱼,而不是抓鱼,并给他。 – batbrat 2009-03-01 11:54:54

18

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

获胜的列表理解 – Jimmy 2015-09-16 18:35:28

6

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

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

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

-1

encode("latin-1")帮助我在我的情况:

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

[u'String']是一个列表的文本表示包含在Python中的Unicode字符串2.

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

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

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

将打印

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

也许我不明白,为什么你不能只是得到element.text,然后使用它之前进行转换? 例如(不知道你为什么会这么做,但...) 找到相应网页的所有标签要素和它们之间的重复,直到你找到一个叫MYTEXT

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

将字符串从我做什么你想要做... 也许我错过了原始消息中的东西? 或者这是你在找什么?