私はWebページを取得し、Webブラウザ(プロキシのように動作する)にHTMLファイルを表示する単純なPython CGIスクリプトを作成しています。ここではスクリプトは次のとおりです。Python urllib.requestとutf8デコードの質問
#!/usr/bin/env python3.0
import urllib.request
site = "http://reddit.com/"
site = urllib.request.urlopen(site)
site = site.read()
site = site.decode('utf8')
print("Content-type: text/html\n\n")
print(site)
コマンドラインから実行すると、このスクリプトは正常に動作しますが、それは、Webブラウザでそれを見に取得するとき、それは空白のページが表示されます。 Apacheのerror_logに表示されるエラーは次のとおりです。
Traceback (most recent call last):
File "/home/public/projects/proxy/script.cgi", line 11, in <module>
print(site)
File "/usr/local/lib/python3.0/io.py", line 1491, in write
b = encoder.encode(s)
File "/usr/local/lib/python3.0/encodings/ascii.py", line 22, in encode
return codecs.ascii_encode(input, self.errors)[0]
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 33777: ordinal not in range(128)
がこの試み。とりわけ、initalのタグの前に "b'00004000 \ r \ n"と表示されます。それをしなければならないのでしょうか?私が間違っていなければ、それは単にバイトコードを意味するのでしょうか? –
@Corey Farwell:ああ、あなたはPython 3を使用していますが、私はそれに気づいていませんでした。私の悪い。ええ、あなたはそれを印刷することはできません、あなたはstdoutにそれを書く必要があります。更新されます。 –
sys.stdout.buffer.write()はStringsを好きではないので、まずContent-typeをutf8にエンコードしてから両方を書き込む必要があります。 「00004000」と最後の行に「00000000」があるWebページの数行(最初の行を含む)を除いてほとんどすべてが機能します。これについてもっと良い方法はありますか?私はstdoutを使うのがちょうどハックだと感じています。 wsgiはこれをより簡単にしますか? –