我在 PyQt4 中编写了抓取网站及其内部框架的代码。
import sys, signal
from PyQt4 import QtGui, QtCore, QtWebKit
class Sp():
def save(self, ok, frame=None):
if frame is None:
print ('main-frame')
frame = self.webView.page().mainFrame()
else:
print('child-frame')
print('URL: %s' % frame.baseUrl().toString())
print('METADATA: %s' % frame.metaData())
print('TAG: %s' % frame.documentElement().tagName())
print('HTML: ' + frame.toHtml())
print()
def handleFrameCreated(self, frame):
frame.loadFinished.connect(lambda: self.save(True, frame=frame))
def main(self):
self.webView = QtWebKit.QWebView()
self.webView.page().frameCreated.connect(self.handleFrameCreated)
self.webView.page().mainFrame().loadFinished.connect(self.save)
self.webView.load(QtCore.QUrl("http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_iframe_scrolling"))
signal.signal(signal.SIGINT, signal.SIG_DFL)
print('Press Crtl+C to quit\n')
app = QtGui.QApplication(sys.argv)
s = Sp()
s.main()
sys.exit(app.exec_())
此代码取决于创建 QApplication 的实例并相应地退出它。
这样做的问题是必须在主线程中创建和退出 QApplication。
我无权访问我正在开发的项目中的主线程。
是否有可能以某种方式避免“QApplication 未在 main() 线程中创建”错误?
也许通过重写代码使其在没有 QApplication 的情况下工作,或者以某种方式使 QApplication 在没有主线程的情况下工作?
编辑:如果主线程不干预其代码的执行流程,我可以编辑主线程,例如app = QtGui.QApplication([])
不会停止流程,但挂起直到另一个线程中的某些代码完成的函数将被视为不适用。