Невозможно использовать в одном приложении QWebPage дважды - PullRequest
2 голосов
/ 02 февраля 2011

Я пытаюсь создать небольшой веб-сервер, который загружает, используя webkit, URL-адрес для извлечения некоторых данных с веб-страницы (например, заголовок, размеры изображений ...).

Я использую PyQt4 для доступа с python к webkit. Для каждого запроса я создаю QThread, который: - создает объект QWebPage, - запустить цикл обработки событий - когда загрузка веб-страницы завершена (сигнал loadFinished), некоторый код извлекает данные из основного кадра QWebPage и убивает QThread

Это работает очень хорошо в первый раз, веб-страница загружена, включая все ее ресурсы (CSS, изображения). Во второй раз, когда я прошу сервер загрузить URL-адрес, веб-страница загружается, но ни один из ее ресурсов (ни 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

1 Ответ

2 голосов
/ 03 февраля 2011

Мне удалось решить проблему: создание QWebPage в потоке GUI (поток цикла событий QApplication) устраняет проблему.

Кажется, что во второй раз, когда используется QWebPage, он пытаетсядоступ к кешу браузера (даже если он был отключен конфигурацией).Но если первый QWebPage не был создан в основном потоке графического интерфейса, кэш несколько неправильно настроен и не может использоваться.

Для создания QWebPage в основном потоке графического интерфейса я использую пользовательское QEvent (QEvent типа User), который запускает инициализацию QWebPage и выборку результатов.

...