gpt4 book ai didi

python - 如何获取网页的html dom及其框架

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:42 24 4
gpt4 key购买 nike

我想在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。

最佳答案

总的来说,这是一个很难解决的问题。

主要困难是无法提前知道每个页面有多少帧。除此之外,每个子框架可能有自己的一组框架,其数量也是未知的。理论上,可能存在无限数量的嵌套框架,并且页面永远无法完成加载(对于有大量广告的网站来说这似乎并不夸张)。

无论如何,下面是您的脚本的一个版本,它获得顶级 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_())

注意:连接到主框架loadFinished信号而不是 WebView 非常重要。如果您连接到后者,如果页面包含多个框架,它将被多次调用。

关于python - 如何获取网页的html dom及其框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35629073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com