Spynner编码错误

时间:2014-11-01 11:01:36

标签: python character-encoding spynner

我正在尝试通过python中的https://itunes.apple.com/ru/app/farm-story/id367107953?mt=8下载此页面 - http://screencloud.net/v/6a7o(在俄罗斯看起来像这样 - spynner) - 它使用了一些javascript检查,所以没有只需在没有完全浏览器仿真的情况下下载它。

我的代码:

# -*- 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�...即使我从结果的开头和结尾删除了标签。

任何帮助?

2 个答案:

答案 0 :(得分:1)

基本上,browser.webframe.toHtml()返回QTString,如果res实际上具有unicode str()字符,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中,您可以通过执行

将其解码为俄语多字节oem字符串(sill a bytestring)
ret = ret.encode("cp1251", errors="replace") # encodes to Win-1251
# or
ret = ret.encode("cp866", errors="replace")  # encodes to windows/dos console

只有这样才能将其保存为ASCII文件。

答案 1 :(得分:0)

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