如何让Python解释器正确处理字符串操作中的非ASCII字符?

111
我有一个看起来像这样的字符串:
6 918 417 712

根据我的理解,Python中清晰明确地截取该字符串的方式是将该字符串存储在一个名为s的变量中,然后执行:

s.replace('Â ', '')

那应该就可以了。但当然,它会抱怨文件 blabla.py 中的非 ASCII 字符 '\xc2' 没有编码。

我从来没有完全理解如何在不同的编码之间切换。

这里是代码,它实际上与上面的代码完全相同,但现在它在上下文中。该文件以 UTF-8 格式保存在记事本中,并具有以下标头:

#!/usr/bin/python2.4
# -*- coding: utf-8 -*-

代码:

f = urllib.urlopen(url)

soup = BeautifulSoup(f)

s = soup.find('div', {'id':'main_count'})

#making a print 's' here goes well. it shows 6Â 918Â 417Â 712

s.replace('Â ','')

save_main_count(s)

它只能达到s.replace...


1
到目前为止尝试了所有4个答案。没有用。 仍然收到UnicodeDecodeError:'ascii'编解码器无法解码第1个位置的0xc2字节:序数不在范围内(128) - adergaard
你的 Unicode 字符串必须以 u 开头。 - SilentGhost
@SilentGhost:正如您所看到的,无法确定它是否为Unicode字符串。我得到了一个包含上述内容的字符串,但其中包含非ASCII字符串。这才是真正的问题。我猜测它是Unicode,因为它不在第一个128个字符内。 - adergaard
错误与输入字符串无关。是你代码中的一个字符串引发了这个错误! - SilentGhost
2
我敢打赌这就是为什么Python 3在字符串和字节序列之间严格区分的原因,只是为了避免这种混淆。 - Mark Ransom
显示剩余2条评论
12个回答

0

我对Beautiful Soup的两分见解:

string='<span style="width: 0px> dirty text begin ( ĀĒēāæśḍṣ <0xa0> ) dtext end </span></span>'
string=string.encode().decode('ascii',errors='ignore')
print(string)

将会给出

<span style="width: 0px> dirty text begin (   ) dtext end </span></span>

0

就我所知,我的字符集是utf-8,并且我已经包含了经典的"# -*- coding: utf-8 -*-"行。

然而,当我从网页中读取这些数据时,我发现我没有通用换行符。

我的文本有两个单词,由"\r\n"分隔。我只在\n上进行拆分并替换"\n"

一旦我循环遍历并查看相关的字符集,我意识到了错误。

因此,它也可能在ASCII字符集内,但是是您没有预料到的字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接