Django 和 lxml 中的解码问题

Decoding problems in Django and lxml

提问人:Deniz Dogan 提问时间:5/1/2009 更新时间:5/14/2009 访问量:1328

问:

在使用我的 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 解码

评论


答:

-2赞 ismail 5/1/2009 #1

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

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

评论

0赞 Deniz Dogan 5/1/2009
有趣!你不知道我的程序在 Django 中的开始是什么?
0赞 ismail 5/1/2009
在调用任何与 lxml 相关的代码之前调用此代码应该可以解决此问题。
0赞 David Berger 5/1/2009
为什么导入后立即调用 reload?它应该在sys.setdefaultencoding之后调用吗?
0赞 Jeremy Dunck 5/12/2009
需要 reload(sys) 的原因是 python 的站点模块专门删除了它。这是因为使用 setdefaultencoding 的客户端代码就像一只拿着枪的猴子。请阅读 joelonsoftware.com/articles/Unicode.htmlgroups.google.com/group/comp.lang.python/browse_thread/thread/...只是不要这样做。
3赞 Jochen Ritzel 5/3/2009 #2

“\x85why hello there!” 不是 UTF-8 编码的字符串。在将网页传递给 lxml 之前,您应该尝试解码该网页。通过查看 http 标头来检查它使用的编码,当您获取页面时,也许您在那里发现了问题。

评论

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

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

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