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)