win_amd64 whl wheel supported para not descargar cp36m cp36 python python-3.x beautifulsoup pyqt4

python - whl - PyQt Class no funciona para el segundo uso



pyqt4 4.11 4 cp36 cp36m win_amd64 whl is not a supported wheel on this platform (1)

El ejemplo se bloquea porque la clase RenderPage intenta crear una nueva QApplication y event-loop 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 utilizar for-loop.

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

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_())

Estoy usando PyQt para cargar completamente una página (incluido 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 en Python, y mucho menos en PyQt, por lo que cualquier ayuda es bienvenida.

Clase prestada desde 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)