我有一些来自网络的文字:
一个£6.49
显然我希望将其显示为:
£6.49
到目前为止,我已尝试过以下内容:
s = url['title']
s = s.encode('utf8')
s = s.replace(u'Â','')
这方面有一些变种(在这个论坛上发现之后)
但是我一直没有运气:
UnicodeDecodeError:'ascii'编解码器 无法解码位置的字节0xc3 100:序数不在范围内(128)
有人能帮助我做到这一点吗?
更新:
添加repr示例和内容类型
u'Star Trek XI £3.99'
u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'
Content-Type: text/html; charset=utf-8
提前致谢。
答案 0 :(得分:7)
如果,s=url['title']
使s
等于此:
In [48]: s=u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'
然后问题是
url
,如果是案例1,我们需要查看定义url
的代码。
如果是案例2,那么快速而肮脏的解决方法是使用s
编解码器对unicode对象raw-unicode-escape
进行编码:
In [49]: print(s)
Oscar Winners Best Pictures Box Set £6.49
In [50]: print(s.encode('raw-unicode-escape'))
Oscar Winners Best Pictures Box Set £6.49
另见SO question。
关于像s=u'Star Trek XI £3.99'
这样的标题:同样,在它到达这个阶段之前修复问题会很好 - 也许是通过查看url
的定义方式。但假设来自网络的内容格式错误,则解决方法是:
In [86]: import re
In [87]: print(re.sub(r'&#x([a-fA-F\d]+);',lambda m: unichr(int(m.group(1),base=16)),s))
Star Trek XI £3.99
一点点解释:
请注意
In [51]: x=u'£'
In [53]: x.encode('utf-8')
Out[53]: '\xc2\xa3'
因此,使用u'£'
编解码器编码的unicode对象utf-8
将成为字符串对象'\xc2\xa3'
。
不知何故,url['title']
被定义为 unicode 对象
u'\xc2\xa3'
。 (u
有很大的不同!)
因此,当我们希望u'\xc2\xa3'
时,我们会'\xc2\xa3'
。
使用u'\xc2\xa3'
编解码器对unicode对象raw-unicode-escape
进行编码会将其转换为'\xc2\xa3'
。
答案 1 :(得分:0)
编辑:您的对象已经在unicode中。在我看来,没有理由实际使用enocde / decode。
>>> print u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'.replace(u'Â','')
Oscar Winners Best Pictures Box Set £6.49
然而,在我看来,那里出了点问题。 unicode对象实际上不是unicode;见:
>>> print 'Oscar Winners Best Pictures Box Set \xc2\xa36.49'.decode('utf8')
Oscar Winners Best Pictures Box Set £6.49
您发布的repr()不应该是unicode对象。这就是为什么我问你在哪里得到数据,有什么不对。