Unicode 问题 Django-Python-URLLIB-MySQL
我正在获取一个网页(http://autoweek.com),想要处理它,但遇到了编码错误。这个网站声明使用“iso-8859-1”编码,并且里面有个词是“Nürburgring”(带有变音符号的u)。
我做了:
# -*- encoding: utf-8 -*-
import urllib
webpage = urllib.urlopen(feed.crawl_url).read()
webpage.decode("utf-8")
结果给我报了以下错误:
'utf8' codec can't decode bytes in position 7768-7773: unsupported Unicode code range"
如果我跳过 .decode 这一步,直接用 lxml 库进行解析,当我尝试把解析出来的标题保存到数据库时,又出现了错误:
'utf8' codec can't decode bytes in position 45-50: unsupported Unicode code range
我的数据库字符集是 utf8,排序规则是 utf-general-ci。
我的设置:
Django
Python 2.4.3
MySQL 5.0.22
MySQL-python 1.2.1
mod_python 3.2.8
2 个回答
3
如果网页声明使用的编码是 iso-8859-1
,那你不能直接用 webpage.decode("iso-8859-1")
吗?
在这个时候,webpage
就是为你的应用解码过的了。当它写入数据库时,数据库那边应该能处理字符到 UTF-8 的编码转换。
要获取正确的编码,你可以告诉网络服务器你只接受,比如说,UTF-8,这样你就能(希望)一直得到这个编码,因为几乎所有人都使用 UTF-8(或者你也可以试试 ISO-8859-1);或者使用 .info 来检查返回流的编码名称。
想了解更多细节,可以查看 urllib2 - The Missing Manual 和 HTTP头部快速参考。
0
autoweek.com 似乎对自己使用的编码方式感到困惑。它声明了相互矛盾的字符集定义:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
然后后面又说...
<meta charset=iso-8859-1"/>.
iso-8859-1 是正确的编码,因为这是从网络服务器返回的头信息中看到的,并且通过 .info()
方法也能解码成功。但这说明你不能完全依赖网页中的内容类型声明。你应该按照 lavinio 提到的方法来处理。