【问题标题】:Problem with encode decode. Python. Django. BeautifulSoup编码解码问题。 Python。姜戈。美丽汤
【发布时间】:2011-03-29 16:21:07
【问题描述】:

在这段代码中:

   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'

【问题讨论】:

  • 请发布print(repr(name.string))print(sys.stdout.encoding)的输出。

标签: python encoding utf-8 beautifulsoup


【解决方案1】:

我不知道你想用name.string.decode('utf-8') 做什么。正如 BeautifulSoup 文档 eloquently points out,“BeautifulSoup 为您提供 Unicode,该死的”。所以name.string 已经解码——它是unicode。如果您愿意,您可以将其编码回 utf-8,但您无法进一步解码。

【讨论】:

    【解决方案2】:

    你可以试试:

    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
    

    这可以帮助您调试编码问题。

    【讨论】:

      【解决方案3】:

      编辑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')
      

      【讨论】:

      • 已经试过没有帮助。有趣的是,在 python 2.6.5 中它可以工作。而 2.5.2 不是.....
      【解决方案4】:

      试试

      text = text.decode("utf-8", "replace")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 2013-10-30
        • 2016-05-19
        相关资源
        最近更新 更多