0

我正在获取一个网页(http://autoweek.com)并尝试处理它,但出现编码错误。Autoweek 声明“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

4

2 回答 2

3

如果webpage声明编码iso-8859-1,你不能这样做webpage.decode("iso-8859-1")吗?

此时,webpage为您的应用程序解码。当它被写入数据库时​​,那里的映射应该处理 char-to-utf8 编码。

要获得正确的编码,要么告诉网络服务器你只接受,比如说,UTF-8,然后这就是你(希望)总是得到的,因为几乎每个人都读 UTF-8(或者你可以尝试使用 ISO- 8859-1); 或使用 .info 检查返回的流的编码名称。

有关详细信息,请参阅urllib2 - The Missing ManualHTTP 标头快速参考

于 2009-07-09T03:48:02.563 回答
0

autoweek.com似乎对自己的编码感到困惑。它声明了冲突的字符集定义:

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

然后...

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

iso-8859-1 是正确的,因为它是在来自 Web 服务器的标头中和通过.info()方法返回的(并且它实际上是解码的),但这表明您不一定依赖于网页中的 Content-Type 声明. 您应该按照 lavinio 描述的方法。

于 2009-07-09T06:50:44.210 回答