Unicode 问题 Django-Python-URLLIB-MySQL

0 投票
2 回答
1460 浏览
提问于 2025-04-15 12:46

我正在获取一个网页(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 ManualHTTP头部快速参考

0

autoweek.com 似乎对自己使用的编码方式感到困惑。它声明了相互矛盾的字符集定义:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

然后后面又说...

<meta charset=iso-8859-1"/>.

iso-8859-1 是正确的编码,因为这是从网络服务器返回的头信息中看到的,并且通过 .info() 方法也能解码成功。但这说明你不能完全依赖网页中的内容类型声明。你应该按照 lavinio 提到的方法来处理。

撰写回答