我正在寫一個簡單的Python CGI腳本,它抓取一個網頁並在Web瀏覽器中顯示HTML文件(就像一個代理)。以下是腳本: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」。它應該這樣做嗎?如果我沒有弄錯,那只是說它是字節碼? – 2011-01-05 08:16:35
@Corey Farwell:哦,你使用的是Python 3,我沒有注意到。我的錯。是的,那麼你不能打印它,你必須寫它到標準輸出。將更新。 – 2011-01-05 08:19:22
sys.stdout.buffer.write()不喜歡字符串,因此您必須先將Content-type編碼爲utf8,然後再編寫兩者。除了幾行(包括第一行)具有'00004000'且最後一行具有'00000000'之外,幾乎所有東西都可以工作。有沒有更好的方法去做這件事?我覺得使用stdout只是一個破解。 wsgi會讓這更容易嗎? – 2011-01-05 08:30:34