Pythonstring打印为

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

我有一个脚本,读取网页,并使用美丽的汤来parsing它。 从我提取所有的链接,因为我的最终目标是打印link.contents。

所有我正在parsing的文本是ASCII。 我知道Python将string视为unicode,我相信这是非常方便的,只是在我的脚本中没有用处。

每次我打印出一个包含“String”的variables时,我都会把[u'String']打印到屏幕上。 有一个简单的方法,让这回到ascii或者我应该写一个正则expression式去掉它吗?

[u'ABC']将是unicodestring的一个元素列表。 美丽的汤总是产生Unicode 。 所以你需要将列表转换为一个unicodestring,然后将其转换为ASCII。

我不知道你是如何获得单一元素的列表。 内容成员将是一个string和标签的列表,这显然不是你所拥有的。 假设你真的总是得到一个单一元素的列表,并且你的testing真的只有 ASCII,你可以使用这个:

  soup[0].encode("ascii") 

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

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

或者你问美丽的汤是什么原始的编码,并得到它在这种编码:

  soup[0].encode(soup.originalEncoding) 

你可能有一个包含一个unicodestring的列表。 这是repr[u'String']

您可以使用以下任何变体将其转换为字节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) 

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

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

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

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

将打印

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

你真的指的是u'String'u'String'吗?

无论如何,你不能只用str(string)来获得一个string而不是一个unicode-string吗? (对Python 3来说,这应该是不同的,所有string都是unicode。)

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

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

[u'String']是包含Python 2上的Unicodestring的列表的文本表示forms。

如果你运行print(some_list)那么它相当于
print'[%s]' % ', '.join(map(repr, some_list))即,用typeslist创build一个Python对象的文本表示,为每个项目调用repr()函数。

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

repr(obj)返回一个包含对象的可打印表示的string。 它的目的是在REPL中对debugging有用的对象进行明确的表示。 经常eval(repr(obj)) == obj

为了避免调用repr() ,你可以直接打印列表项(如果它们都是Unicodestring的话)例如: print ",".join(some_list) – 打印逗号分隔的string列表: String

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

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

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

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

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

从我转换string,做你想做的事情…也许我原来的消息中缺less的东西? 或者这是你在找什么?

这是因为你可能没有指定数据的types,无论是string还是其他的。 为我工作。