2

我正在尝试创建一个小型 Web 服务器,它使用 webkit 加载一个 URL,以从网页中提取一些数据(例如:标题、图像大小......)。

我正在使用 PyQt4 从 python 访问 webkit。对于每个请求,我正在创建一个 QThread,它: - 创建一个 QWebPage 对象, - 运行一个事件循环 - 当网页的加载完成时(loadFinished 信号),一些代码从 QWebPage 的 mainFrame 中提取数据并杀死线程

这在第一次加载时效果很好,加载了网页,包含了它的所有资源(CSS、图像)。第二次我要求服务器加载一个 url,网页被加载,但没有任何资源(没有 css,没有图像)。因此,当我尝试检索图像大小时,所有大小都设置为 0,0。

这是一些代码片段:

# 负责加载网页的 QThread
类WebKitThread(QThread):
    def __init__(self, url):
        QThread.__init__(self)
        self.url = 网址
        self.start()
    定义运行(自我):
        self.webkitParser = WebKitParser(self.url)
        self.exec_()

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.computePageProperties()
        QThread.currentThread().exit()

    def 计算页面属性(自我):
        # 一些读取标题、图像大小的自定义代码...
        self.computedTitle=XXXXXXXX

调用代码(响应 HTTP 请求)正在执行:

t = WebKitThread(url)
t.wait()
# 使用 WebKitParser 的属性做一些事情
打印 t.webkitParser.computedTitle
4

1 回答 1

2

我已经设法解决了这个问题:在 GUI 线程(QApplication 事件循环的线程)中创建 QWebPage 解决了这个问题。

似乎第二次使用 QWebPage 时,它​​会尝试访问浏览器缓存(即使它已被配置禁用)。但是,如果第一个 QWebPage 不是在主 GUI 线程中创建的,则缓存有些配置错误并且不可用。

为了在主 GUI 线程中创建 QWebPage,我使用了一个自定义 QEvent(用户类型的 QEvent)来触发 QWebPage 初始化和结果获取。

于 2011-02-03T11:20:54.533 回答