我想在js执行后获取网站的DOM。 我还希望获得网站中iframe的所有内容,与Google Chrome的Inspect Element功能相似。
这是我的代码:
import sys
from PyQt4 import QtGui, QtCore, QtWebKit
class Sp():
def save(self):
print ("call")
data = self.webView.page().currentFrame().documentElement().toInnerXml()
print(data.encode('utf-8'))
print ('finished')
def main(self):
self.webView = QtWebKit.QWebView()
self.webView.load(QtCore.QUrl("http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_iframe_scrolling"))
QtCore.QObject.connect(self.webView,QtCore.SIGNAL("loadFinished(bool)"),self.save)
app = QtGui.QApplication(sys.argv)
s = Sp()
s.main()
sys.exit(app.exec_())
这给了我网站的html,但不是iframe里面的html。有什么方法可以获得iframe的HTML。
答案 0 :(得分:1)
这是一个非常难以解决的问题。
主要困难在于无法预先知道每页有多少帧。除此之外,每个子帧可能有自己的一组帧,其数量也是未知的。理论上,可能存在无限数量的嵌套帧,页面永远不会完成加载(对于拥有大量广告的网站来说,这似乎并不夸张。)
无论如何,下面是一个脚本版本,它在加载时获取每个帧的顶级QWebFrame对象,并显示如何访问您感兴趣的一些内容。正如您将看到的从输出中,有很多"垃圾"广告插入的框架,您将以某种方式过滤掉。
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()
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_())
NB :您必须连接到主框架的loadFinished
信号,而不是网络视图。如果连接到后者,如果页面包含多个帧,则会多次调用它。