[英]Problem with encode decode. Python. Django. BeautifulSoup
在此代码中:
soup=BeautifulSoup(program.Description.encode('utf-8'))
name=soup.find('div',{'class':'head'})
print name.string.decode('utf-8')
我尝试打印或保存到数据库时发生错误。
我正在做什么:
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'
我不知道你想用name.string.decode('utf-8')
。 正如BeautifulSoup文档雄辩地指出 ,“ BeautifulSoup为您提供Unicode,该死”。 所以name.string
已经被解码-它是unicode的。 您可以根据需要将其编码回utf-8,但无法对其进一步解码。
你可以试试:
print name.string.encode('ascii', 'replace')
无论sys.stdout
的编码是什么(包括None),都应接受输出。
实际上,您要打印的类似文件的对象可能不接受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
这可以帮助您调试编码问题。
编辑 : name.string
来自BeautifulSoup,所以它大概已经是一个unicode字符串。
但是,您的错误消息中提到“ ascii”:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5:
ordinal not in range(128)
根据PrintFails Python Wiki页面的介绍 ,如果Python不知道或无法确定您的输出设备期望使用哪种编码,则它将sys.stdout.encoding设置为None
并print
尝试使用'ascii'编解码器对其参数进行编码。
我相信这是造成您问题的原因。 您可以通过查看print sys.stdout.encoding
None
来确认这一点。
根据上面链接的同一页面,您可以通过明确告诉Python使用哪种编码来规避此问题。 您可以将sys.stdout包装在StreamWriter
的实例中:
例如,您可以尝试添加
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')
尝试
text = text.decode("utf-8", "replace")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.