Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么QNetworkReply readAll()返回零字节?_Python_Networking_Network Programming_Pyqt4_Qtwebkit - Fatal编程技术网

Python 为什么QNetworkReply readAll()返回零字节?

Python 为什么QNetworkReply readAll()返回零字节?,python,networking,network-programming,pyqt4,qtwebkit,Python,Networking,Network Programming,Pyqt4,Qtwebkit,我正在使用pyqt4中的qtwebkit通过QNetworkReply下载图像: import os import sys from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtWebKit import QWebPage class dxBrowser(QWebPage): def __init__(self,url): QWebPage.__init__(self) self._url=url

我正在使用pyqt4中的qtwebkit通过QNetworkReply下载图像:

import os 
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import QWebPage

class dxBrowser(QWebPage):
def __init__(self,url):
    QWebPage.__init__(self)
    self._url=url
    self.manager=self.networkAccessManager()
    self.connect(self.manager,SIGNAL("finished(QNetworkReply *)"),self.onFinished)

def crawl(self):
    self.mainFrame().load(QUrl(self._url))

def onFinished(self,networkReply):
    if networkReply.rawHeader('Content-Type')=='image/png':
        print 'find the image'
        l=int(networkReply.rawHeader('Content-Length'))
        print l
        byteArray=networkReply.readAll()
        print byteArray.size()
        im=QImage.fromData(byteArray)
        if not im.save('test.jpg','jpg'):
            print 'image save error'


def main():
    app=QApplication(sys.argv)
    url='http://www.yiyaows.cn/DrsPath.do?kid=6666686E686E69673334333632303335&username=mylibddrz&spagenum=251&pages=50&fid=7534992&a=95cb07394dbf1d43c1fe61bdf6d4a36d&btime=2011-08-19&etime=2011-09-08&template=bookdsr1&firstdrs=http%3A%2F%2Fbook1.duxiu.com%2FbookDetail.jsp%3FdxNumber%3D000005609810%26d%3DA30222298F3C6715323B5476CB66D650'
    dx=dxBrowser(url)
    dx.crawl()
    sys.exit(app.exec_())

if __name__=='__main__':
    main()    
虽然内容长度不为零,但byteArray.size()为0。所以我无法保存图像。为什么?有人能帮我吗

编辑: 也许我知道了。qtwebkit可能已检索qnetworkreply的内容,QIODevice,readall()后其大小将为0。我猜,可能作为浏览器的qtwebkit已将其读取以进行渲染

编辑:也许我知道了。qtwebkit可能已检索到 qnetworkreply的内容,一个QIODevice,其大小为0 readall()之后。可能作为浏览器的qtwebkit已经读取了 我想是渲染吧

是的,有一个简单的解决方法:将
QNetworkDiskCache
添加到管理器(使用),然后从插槽中的缓存中检索映像
onFinished


如果网站使用“Pragma:no cache”或“cache control”提示浏览器不要将文件保存到磁盘,则在调用原始方法之前,您必须重新定义
QNetworkDiskCache
prepare
(可能还有
updateMetaData
)方法,以覆盖标记
saveToDisk
.

dxBrowser上的
reply
属性来自何处?抱歉,前面的代码错误。设置缓存后,QNetworkAccessManager实例是否会自动写入该缓存?或者每次请求后都必须手动插入?@izyda您只需调用
setCache
一次,设置后任何新请求都会立即生效。这很好,但现在我又回到了“Pragma:no cache”或“cache control”问题。你能给我一些建议,告诉我应该如何处理这个问题吗?我是否应该创建一个Python类,该类继承自
QNetworkDiskCache
,只覆盖prepare方法?