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。)
使用dir
或type
'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还是其他的。 为我工作。