La clase PyQt no funciona para el segundo uso

Estoy usando PyQt para cargar completamente una página (incluyendo JS) y obtener su contenido usando Beautiful Soup. Funciona bien en la primera iteración, pero después, se bloquea. No tengo un gran conocimiento de Python, y mucho menos en PyQt, por lo que cualquier ayuda es bienvenida.

Clase prestada de aquí .

from PyQt4.QtCore import QUrl, SIGNAL from PyQt4.QtGui import QApplication from PyQt4.QtWebKit import QWebPage from bs4 import BeautifulSoup from bs4.dammit import UnicodeDammit import sys import signal class Render(QWebPage): def __init__(self, url): self.app = QApplication(sys.argv) QWebPage.__init__(self) self.html = None signal.signal(signal.SIGINT, signal.SIG_DFL) self.connect(self, SIGNAL('loadFinished(bool)'), self._finished_loading) self.mainFrame().load(QUrl(url)) self.app.exec_() def _finished_loading(self, result): self.html = self.mainFrame().toHtml() self.soup = BeautifulSoup(UnicodeDammit(self.html).unicode_markup) self.app.quit() ################################################################### l = ["http://www.google.com/?q=a", "http://www.google.com/?q=b", "http://www.google.com/?q=c"] for page in l: soup = Render(page).soup print("# soup done: " + page) 

introduzca la descripción de la imagen aquí

El ejemplo se bloquea porque la clase RenderPage intenta crear una nueva QApplication y un QApplication eventos para cada url que intenta cargar.

En su lugar, solo se debe QApplication una QApplication , y la subclase QWebPage debe cargar una nueva URL después de que se haya procesado cada página, en lugar de usar un bucle for.

Aquí hay una re-escritura del ejemplo que debería hacer lo que quieres:

 import sys, signal from bs4 import BeautifulSoup from bs4.dammit import UnicodeDammit from PyQt4 import QtCore, QtGui, QtWebKit class WebPage(QtWebKit.QWebPage): def __init__(self): QtWebKit.QWebPage.__init__(self) self.mainFrame().loadFinished.connect(self.handleLoadFinished) def process(self, items): self._items = iter(items) self.fetchNext() def fetchNext(self): try: self._url, self._func = next(self._items) self.mainFrame().load(QtCore.QUrl(self._url)) except StopIteration: return False return True def handleLoadFinished(self): self._func(self._url, self.mainFrame().toHtml()) if not self.fetchNext(): print('# processing complete') QtGui.qApp.quit() def funcA(url, html): print('# processing:', url) # soup = BeautifulSoup(UnicodeDammit(html).unicode_markup) # do stuff with soup... def funcB(url, html): print('# processing:', url) # soup = BeautifulSoup(UnicodeDammit(html).unicode_markup) # do stuff with soup... if __name__ == '__main__': items = [ ('http://stackoverflow.com', funcA), ('http://google.com', funcB), ] signal.signal(signal.SIGINT, signal.SIG_DFL) print('Press Ctrl+C to quit\n') app = QtGui.QApplication(sys.argv) webpage = WebPage() webpage.process(items) sys.exit(app.exec_())