2014-11-01 25 views
0

我試圖通過spynner在python下載這個頁面 - https://itunes.apple.com/ru/app/farm-story/id367107953?mt=8(在俄羅斯看起來像這樣 - http://screencloud.net/v/6a7o) - 它使用了一些javascript檢查,所以不會在沒有完整瀏覽器模擬的情況下直接下載它。Spynner錯誤的編碼

我的代碼:

# -*- coding: utf-8 -*- 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

from StringIO import StringIO 
import spynner 


def log(str, filename_end): 
    filename = '/tmp/apple_log_%s.html' % filename_end 
    print 'logged to %s' % filename 
    f = open(filename, 'w') 
    f.write(str) 
    f.close() 

debug_stream = StringIO() 
browser = spynner.Browser(debug_level=3, debug_stream=debug_stream) 

browser.load("https://itunes.apple.com/ru/app/farm-story/id367107953?mt=8") 

ret = browser.contents 
log(ret, 'noenc') 

print 'content length = %s' % len(ret) 
browser.close() 
del browser 

f=open('/tmp/apple_log_debug', 'w') 
f.write(debug_stream.getvalue()) 
f.close() 
print 'log stored in /tmp/debug_log' 

那麼,問題是:無論是蘋果,要麼spynner工作錯西裏爾字母符號。如果我在加載後嘗試使用browser.show(),我會看到它們正常,但在代碼和日誌中,它們仍然是錯誤的編碼,如<meta content="ÐолÑÑиÑÑ Farm Story⢠в App Store. ÐÑоÑмоÑÑеÑÑ ÑкÑинÑоÑÑ Ð¸ ÑейÑинги, пÑоÑиÑаÑÑ Ð¾ÑзÑÐ²Ñ Ð¿Ð¾ÐºÑпаÑелей." property="og:description">

http://2cyr.com/說,這是一個utf-8文本顯示像iso-8859-1 ...

正如你看到的 - 我不我的要求使用任何頭,但如果我把他們從Chrome的網絡調試控制檯,並通過它至load()方法例如headers=[('Accept-Encoding', 'utf-8'), ('Accept-Language', 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4')] - 我得到了同樣的結果。

另外,從相同的網絡控制檯,您可以看到chrome使用gzip,deflate,sdch作爲Accept-Encoding。我也可以嘗試,但我無法解碼我得到的結果:<html><head></head><body>��}ksÇ�g!���4�I/z�O���/)�(yw���é®i��{�<v���:��ٷ�س-?�b�b�� j�...,即使我從結果的開始和結束中刪除標記。

任何幫助?

回答

0

str(browser.webframe.toHtml())救了我

+0

對於稍後發現此問題的人員,您應該嘗試對解決方案進行一點說明,而不僅僅是一行代碼。 – 2014-11-02 16:35:16

1

基本上,browser.webframe.toHtml()返回在這種情況下str()一個QTString不會幫助,如果資源實際上有統一non-latin字符。 如果你想獲得一個Python unicode字符串,你需要做的:

ret = unicode(browser.webframe.toHtml().toUtf8(), encoding="UTF-8") 
#if you want to get rid of non-latin text 
ret = ret.encode("ascii", errors="replace") # encodes to bytestring 

如果你懷疑它在Russian你可以通過做

ret = ret.encode("cp1251", errors="replace") # encodes to Win-1251 
# or 
ret = ret.encode("cp866", errors="replace") # encodes to windows/dos console 
譯碼後,俄羅斯的多字節OEM字符串(窗臺字節字符串)

只有您可以將它保存到ASCII文件。