我正在尝试创建一个小型Web服务器,使用webkit加载一个URL,从网页中提取一些数据(例如:标题,图像大小......)。
我正在使用PyQt4从python访问webkit。对于每个请求,我正在创建一个QThread: - 创建一个QWebPage对象, - 运行事件循环 - 当网页加载完成后(loadFinished信号),一些代码从QWebPage的mainFrame中提取数据并杀死QThread
第一次加载网页时,这非常有效,包括所有资源(CSS,图像)。 我第二次要求服务器加载网址,网页被加载,但没有任何资源(没有CSS,没有图像)。因此,当我尝试检索图像大小时,所有大小都设置为0,0。
以下是一些代码片段:
# The QThread responsible of loading the WebPage class WebKitThread(QThread): def __init__(self, url): QThread.__init__(self) self.url = url self.start() def run(self): self.webkitParser = WebKitParser(self.url) self.exec_() class WebKitParser(QWebPage): def __init__(self, url, parent=None): QWebPage.__init__(self, parent ) self.loadFinished.connect(self._loadFinished) self.mainFrame().load(QUrl(url)) def _loadFinished(self, result): self.computePageProperties() QThread.currentThread().exit() def computePageProperties(self): # Some custom code that reads title, image size... self.computedTitle=XXXXXXXX
调用代码(响应HTTP请求)正在执行:
t = WebKitThread(url) t.wait() # do some stuff with properties of WebKitParser print t.webkitParser.computedTitle
答案 0 :(得分:2)
我设法解决了这个问题:在GUI线程中创建QWebPage(QApplication事件循环的线程)解决了这个问题。
似乎第二次使用QWebPage时,它会尝试访问浏览器缓存(即使它已被配置禁用)。但是如果没有在主GUI线程中创建第一个QWebPage,则缓存有些配置错误且无法使用。
要在主GUI线程中创建QWebPage,我正在使用一个自定义QEvent(类型为User的QEvent)来触发QWebPage初始化和结果获取。