[解決済み] PythonでUnicodeからASCIIにエラーなく変換する
質問
私のコードは、ウェブページをスクレイピングして、それをユニコードに変換しているだけです。
html = urllib.urlopen(link).read()
html.encode("utf8","ignore")
self.response.out.write(html)
しかし、私は
UnicodeDecodeError
:
Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 507, in __call__
handler.get(*groups)
File "/Users/greg/clounce/main.py", line 55, in get
html.encode("utf8","ignore")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 2818: ordinal not in range(128)
これは、HTMLのどこかに間違った形式のUnicodeの試みが含まれていることを意味していると思います。 エラーになる代わりに、問題を引き起こしているコードバイトをすべて削除することはできますか?
解決方法は?
2018年最新情報です。
2018年2月現在、以下のような圧縮を使用すると
gzip
になりました。
かなりポピュラー
(Google、YouTube、Yahoo、Wikipedia、Reddit、Stack Overflow、Stack Exchange Networkサイトなどの大規模サイトを含む、全ウェブサイトの約73%が使用しています)。
gzip化されたレスポンスで元の回答のような単純なデコードを行うと、以下のような、またはそれに似たエラーが発生します。
UnicodeDecodeError: 'utf8' コーデックはポジション1のバイト0x8bをデコードできません: 予期しないコードバイトです。
gzpipされた応答をデコードするためには、以下のモジュールを追加する必要があります(Python 3の場合)。
import gzip
import io
注
Python 2では
StringIO
の代わりに
io
すると、このようにコンテンツをパースして取り出すことができます。
response = urlopen("https://example.com/gzipped-ressource")
buffer = io.BytesIO(response.read()) # Use StringIO.StringIO(response.read()) in Python 2
gzipped_file = gzip.GzipFile(fileobj=buffer)
decoded = gzipped_file.read()
content = decoded.decode("utf-8") # Replace utf-8 with the source encoding of your requested resource
このコードはレスポンスを読み、そのバイトをバッファに格納します。その際
gzip
モジュールは、バッファを読み取るために
GZipFile
関数を使用します。その後、gzipされたファイルを再びバイト単位で読み込んで、最終的に普通に読めるテキストにデコードすることができます。
2010年のオリジナル回答です。
に使用されている実際の値を取得することはできますか?
link
?
さらに、通常、ここでこの問題に遭遇するのは、次のような場合です。
.encode()
すでにエンコードされているバイト列を そこで、次のようにまずデコードしてみるのもよいでしょう。
html = urllib.urlopen(link).read()
unicode_str = html.decode(<source encoding>)
encoded_str = unicode_str.encode("utf8")
例として
html = '\xa0'
encoded_str = html.encode("utf8")
で失敗します。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128)
ながら。
html = '\xa0'
decoded_str = html.decode("windows-1252")
encoded_str = decoded_str.encode("utf8")
エラーなしで成功します。なお、"windows-1252" は、私が
例
. 私はこれを
シャルデ
で、それが正しいという信頼度は0.5だった! (まあ、1文字長の文字列で与えられたので、何を期待してもいいのですが)あなたはこれを
.urlopen().read()
を、取得したコンテンツに適用されるものに変更します。
そこに見えるもう一つの問題は
.encode()
文字列メソッドは変更された文字列を返し、その場でソースを変更することはありません。だから、ある意味無駄な
self.response.out.write(html)
htmlはhtml.encodeでエンコードされた文字列ではないので(それが本来の目的であるならば)。
Ignacio が提案したように、ソースのウェブページで
read()
. MetaタグかレスポンスのContentTypeヘッダーの中にあります。のパラメータとして使用します。
.decode()
.
しかし、他の開発者がヘッダやメタ文字セットの宣言が実際のコンテンツと一致しているかどうかを確認する責任を負っているとは考えない方がよいことに注意してください。(これは面倒なことですが、ええ、私は知っているはずです。 でした 以前はその一人でした)。
関連
-
Python LeNetネットワークの説明とpytorchでの実装
-
Python 入出力と高次代入の基礎知識
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] バイトを文字列に変換する
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] 文字のASCII値を取得する方法
-
[解決済み] UTF-8とBOMなしUTF-8の違いは何ですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python関数の高度な応用を解説
-
PicgoのイメージベッドツールをPythonで実装する
-
Python百行で韓服サークルの画像クロールを実現する
-
任意波形を生成してtxtで保存するためのPython実装
-
Python 入出力と高次代入の基礎知識
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み】NameError: 名前 'self' が定義されていません。