繁体   English   中英

编码解码问题。 蟒蛇。 Django的。 美丽汤

[英]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设置为Noneprint尝试使用'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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM