2009-07-09 15 views
0

Webページ(http://autoweek.com)を取り出して処理しようとしていますが、エンコードエラーが発生しました。 Autoweekは "ISO-8859-1" のエンコードを宣言し、単語 "ニュルブルクリンク"(ウムラウト付きのu)Unicodeの問題Django-Python-URLLIB-MySQL

を持っている私が行います

# -*- 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-一般-CI

私の設定があります。
ジャンゴ
のPython 2.4.3
のMySQL 5.0.22
のMySQL-pythonの1.2.1
mod_pythonの3.2.8

答えて

0

autoweek.com自分のエンコードについては混乱しているようです。これは、競合文字セットの定義を宣言します。

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

、これは、ウェブサーバからと.info()方法によりヘッダーに返されているので、後...

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

ISO-8859-1が正しいものです(実際にはデコードされますが)、これはWebページのContent-Type宣言に必ずしも依存できないことを示しています。あなたはlavinioによって記述された方法に従うべきです。

3

webpageが符号化iso-8859-1を宣言している場合、webpage.decode("iso-8859-1")を行うことはできませんか?

その時点で、webpageがあなたのアプリでデコードされます。それがデータベースに書き込まれるとき、マッピングはchar-to-utf8エンコーディングを処理する必要があります。

正しいエンコーディングを取得するには、WebサーバーにUTF-8を受け入れるように指示してください。そうすれば、いつでも誰でもUTF-8を読むことができます。それはISO-8859-1で)。 .infoを使用して返されるストリームのエンコーディング名を検査します。

詳細については、urllib2 - The Missing ManualおよびQuick reference to HTTP headersを参照してください。

+0

私はフェッチしている(異なるエンコーディングの)すべてのページにこのソリューションをシリアル化する必要があります。だから私はフェッチし、エンコードを抽出し(宣言されている場合)、デコードしなければなりません。 さらに簡単なソリューションですか? –

+1

いいえ、間違った文字を捨てない限り、これは唯一の解決策です。正直なところ、それほど複雑ではありません。 –

+0

+1 iso-8859-1を使用してデコードする必要があります。私はあなたのURLに対してこれを確認して、うまくいきます。 – mhawke

関連する問題