【发布时间】:2013-02-08 16:25:36
【问题描述】:
我有以下类可以返回任何给定网页的 HTML:
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()
我有一个循环来遍历需要运行的 JavaScript 的网页列表,例如:
l = ["http://host.com/page1", "http://host.com/page2"]
for page in l:
soup = Render(page).soup
#Do-something
问题是 JavaScript 代码仅在加载的第一个页面中执行,之后不解释任何内容。
【问题讨论】:
-
这可能是因为
QWebPage在发出loadFinished信号之前没有等待javascript 执行 -
第一次运行不应该也执行失败吗?
-
不一定,它可能在您的第一页上加载得足够快,或者可能是 javascript 没有完全呈现
-
@X.Jacobs 我不认为
loadFinished是原因。由于 qt 文档指出:当视图开始加载时会发出loadStarted()信号。另一方面,loadProgress()信号在 Web 视图的元素完成加载时发出,例如嵌入图像、脚本 等。最后,loadFinished()信号被发出当视图完全加载时。 -
@nymk 是的,脚本可能已加载,但未渲染
标签: python python-2.7 pyqt pyqt4