在此代码中:
soup=BeautifulSoup(program.Description.encode('utf-8'))
name=soup.find('div',{'class':'head'})
print name.string.decode('utf-8')
当我尝试打印或保存到数据库时发生错误。
dosp metter metter我在做什么:print name.string.encode('utf-8')
或只是
print name.string
Traceback (most recent call last):
File "./manage.py", line 16, in <module>
execute_manager(settings)
File "/usr/local/cluster/dynamic/virtualenv/lib/python2.5/site-packages/django/core/management/__init__.py", line 362, in execute_manager
utility.execute()
File "/usr/local/cluster/dynamic/virtualenv/lib/python2.5/site-packages/django/core/management/__init__.py", line 303, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/cluster/dynamic/virtualenv/lib/python2.5/site-packages/django/core/management/base.py", line 195, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/cluster/dynamic/virtualenv/lib/python2.5/site-packages/django/core/management/base.py", line 222, in execute
output = self.handle(*args, **options)
File "/usr/local/cluster/dynamic/website/video/remmedia/management/commands/remmedia.py", line 50, in handle
self.FirstTimeLoad()
File "/usr/local/cluster/dynamic/website/video/remmedia/management/commands/remmedia.py", line 115, in FirstTimeLoad
print name.string.decode('utf-8')
File "/usr/lib/python2.5/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: ordinal not in range(128)
这是repr(name.string)
u'\ u0412 \ u044b \ u043f \ u0443 \ u0441 \ u043a \ u043e \ u0442 27 \ u0434 \ u0435 \ u043a \ u0430 \ u0431 \ u0440 \ u044f'
答案 0 :(得分:5)
我不知道你要对name.string.decode('utf-8')
做些什么。作为BeautifulSoup文档eloquently points out,“BeautifulSoup为您提供Unicode,该死”。所以name.string
已经被解码 - 它是unicode。如果您愿意,可以编码将其重新编码为utf-8,但您无法再对其进行解码。
答案 1 :(得分:4)
您可以尝试:
print name.string.encode('ascii', 'replace')
无论sys.stdout
的编码是什么(包括无),都应接受输出。
实际上,您要打印的类文件对象可能不接受UTF-8。这是一个例子:如果你有明显的良性程序
# -*- coding: utf-8 -*-
print u"hérisson"
然后在可以打印重音字符的终端中运行它可以正常工作:
lebigot@weinberg /tmp % python2.5 test.py
hérisson
但是打印到连接到Unix管道的标准输出不会:
lebigot@weinberg /tmp % python2.5 test.py | cat
Traceback (most recent call last):
File "test.py", line 3, in <module>
print u"hérisson"
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1: ordinal not in range(128)
因为sys.stdout
具有编码None
,在这种情况下:Python认为通过管道读取的程序应该接收ASCII,并且打印失败,因为ASCII不能代表我们要打印的单词。像上面那样的解决方案解决了这个问题。
注意:您可以使用以下方法检查标准输出的编码:
print sys.stdout.encoding
这可以帮助您调试编码问题。
答案 2 :(得分:0)
修改:name.string
来自BeautifulSoup,因此它可能已经是一个unicode字符串。
但是,您的错误消息提到'ascii':
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5:
ordinal not in range(128)
根据PrintFails Python wiki page,如果Python不知道或
它无法确定输出设备期望的编码类型
sys.stdout.encoding到None
和print
尝试用其编码其参数
'ascii'编解码器。
我相信这是你问题的原因。您可以通过查看来确认这一点
如果print sys.stdout.encoding
打印None
。
根据上面链接的同一页面,您可以通过以下方式解决问题
明确地告诉Python使用什么编码。你这样做是包装
StreamWriter
实例中的sys.stdout:
例如,您可以尝试添加
import sys
import locale
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
在print
语句之前到您的脚本。你可能不得不改变
locale.getpreferredencoding()
和显式编码(例如'utf-8',
'cp1252'等)。要使用的正确编码取决于您的输出设备。
它应该设置为输出设备所期望的任何编码。如果
您正在输出到终端,终端可能有一个允许的菜单设置
用户设置终端应该期望的编码类型。
原始回答:尝试:
print name.string
或
print name.string.encode('utf-8')
答案 3 :(得分:-1)
试
text = text.decode("utf-8", "replace")