首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spynner错误编码

Spynner错误编码
EN

Stack Overflow用户
提问于 2014-11-01 19:01:36
回答 2查看 2.6K关注 0票数 1

我正在尝试通过python中的spynner下载这个页面- https://itunes.apple.com/ru/app/farm-story/id367107953?mt=8 (对于我来说在俄罗斯是这样的- http://screencloud.net/v/6a7o)它使用了一些javascript检查,所以如果没有完全的浏览器模拟,就不能简单地下载它。

我的代码:

代码语言: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/说它是一个像iso-8859-1一样显示的utf-8文本...

正如你所看到的-我没有在我的请求中使用任何头部,但如果我从chrome的网络调试控制台中获取它们,并将其传递给headers=[('Accept-Encoding', 'utf-8'), ('Accept-Language', 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4')]load()方法-我会得到相同的结果。

此外,在同一个网络控制台中,您可以看到chrome使用gzip,deflate,sdch作为接受编码。我也可以尝试这样做,但是我无法解码我得到的东西:<html><head></head><body>��}ksÇ�g!���4�I/z�O���/)�(yw���é®i��{�<v���:��ٷ�س-?�b�b�� j�...,即使我删除了结果开头和结尾的标签。

有什么帮助吗?

EN

回答 2

Stack Overflow用户

发布于 2015-07-09 23:02:46

基本上,browser.webframe.toHtml()返回一个QTString,在这种情况下,如果res实际上包含unicode non-latin字符,则str()不会提供帮助。如果你想得到一个Python unicode字符串,你需要做的是:

代码语言:javascript
复制
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一个字节字符串

代码语言:javascript
复制
ret = ret.encode("cp1251", errors="replace") # encodes to Win-1251
# or
ret = ret.encode("cp866", errors="replace")  # encodes to windows/dos console

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

票数 1
EN

Stack Overflow用户

发布于 2014-11-03 00:12:00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26688624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档