编码解码的问题。蟒蛇。 Django的。 BeautifulSoup

时间:2010-08-13 21:01:45

标签: python encoding utf-8 beautifulsoup

在此代码中:

   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'

4 个答案:

答案 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到Noneprint尝试用其编码其参数 '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")