2011-02-02 2 views
2

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

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

Это очень хорошо работает при первой загрузке веб-страницы, включая все ее ресурсы (CSS, изображения). Второй раз, когда я запрашиваю сервер для загрузки URL-адреса, загружается веб-страница, но ни один из ее ресурсов (без css, без изображений). Поэтому, когда я пытаюсь получить размеры изображений, размер будет равен 0,0.

Вот код snipset:

 
# 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 

ответ

2

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

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

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

+0

Вы можете разместить объявление? – hoju

Смежные вопросы