【问题标题】:Decoding problems in Django and lxmlDjango 和 lxml 中的解码问题
【发布时间】:2010-10-22 22:30:10
【问题描述】:

在使用我的 Django 应用程序的已部署版本时,我遇到了一个奇怪的 lxml 问题。我使用 lxml 解析从服务器获取的另一个 HTML 页面。这在我自己计算机上的开发服务器上运行良好,但由于某种原因,它在服务器上给了我UnicodeDecodeError

('utf8', "\x85why hello there!", 0, 1, 'unexpected code byte')

我已确保 Apache(使用 mod_python)与 LANG='en_US.UTF-8' 一起运行。

我已经尝试用谷歌搜索这个问题,并尝试了不同的方法来正确解码字符串,但我无法弄清楚。

在您的回答中,您可能会假设我的字符串称为hello 或其他名称。

【问题讨论】:

    标签: python django utf-8 lxml decoding


    【解决方案1】:

    由于修改 site.py 不是一个理想的解决方案,请在程序开始时尝试以下操作:

    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    

    【讨论】:

    • 有趣!你不知道我的程序在 Django 中的开头是什么?
    • 在调用任何 lxml 相关代码之前调用此代码应该可以解决问题。
    • 为什么在导入后立即调用reload?是否应该在 sys.setdefaultencoding 之后调用?
    • 需要 reload(sys) 的原因是 python 的站点模块专门删除了它。这是因为使用 setdefaultencoding 的客户端代码就像拿着枪的猴子。请阅读joelonsoftware.com/articles/Unicode.htmlgroups.google.com/group/comp.lang.python/browse_thread/thread/… 只是不要这样做。
    【解决方案2】:

    "\x85为什么你好!"不是 utf-8 编码的字符串。您应该在将网页传递给 lxml 之前尝试解码网页。在获取页面时通过查看 http 标头来检查它使用的编码,也许你会在那里发现问题。

    【讨论】:

    • 同意。试试 "\x85why hello there!".decode("utf-8")。这会将非 unicode 代码 (\x85) 更改为 unicode 代码。您可能还需要在 .py 文件的顶部添加:“# -- coding: utf-8 --”(不带引号)。
    • 我同意这可能是由于您返回的字节字符串实际上不是 utf-8。一般来说,如果您声称要创建一个 UTF-8 字符串,您应该在内部使用 unicode 类型,并且在将位放在网络上之前,将其编码为 utf-8。如果你将字节串混在一起,你几乎肯定会在某个地方搞砸,然后在很久以后的某个地方发现它。 FWIW, "\x85" == "#"。
    【解决方案3】:

    u"\x85why hello there!" 之类的语法没有帮助吗?

    您可能会发现 Python 官方文档中的以下资源很有帮助:

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 1970-01-01
      • 2019-03-19
      • 2016-04-25
      • 2013-02-24
      • 2011-02-19
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      相关资源
      最近更新 更多