1

我正在尝试下载此页面 - https://itunes.apple.com/ru/app/farm-story/id367107953?mt=8(在俄罗斯对我来说看起来像这样 - http://screencloud.net/v /6a7o)通过python 中的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')]-我会得到相同的结果。

此外,从同一个网络控制台,您可以看到 chromegzip,deflate,sdch用作 Accept-Encoding。我也可以尝试,但我无法解码我得到的内容:<html><head></head><body>��}ksÇ�g!���4�I/z�O���/)�(yw���é®i��{�<v���:��ٷ�س-?�b�b�� j�...即使我从结果的开头和结尾删除了标签。

有什么帮助吗?

4

2 回答 2

1

基本上, browser.webframe.toHtml() 返回 aQTString在这种情况下,如果 res 实际上具有 unicode字符,str()则无济于事。non-latin如果你想得到一个 Pythonunicode字符串,你需要这样做:

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 字符串(仍然是一个字节串)

ret = ret.encode("cp1251", errors="replace") # encodes to Win-1251
# or
ret = ret.encode("cp866", errors="replace")  # encodes to windows/dos console

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

于 2015-07-09T15:02:46.170 回答
0

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

于 2014-11-02T16:11:59.967 回答