将所有帧连接到一个HTML,PyQt4

时间:2016-02-28 11:47:58

标签: python pyqt pyqt4 qtwebkit

我在python 3中使用PyQt4 我使用以下代码加载网站的源代码,包括网站的所有iframe:

import sys, signal, time
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('Time: ' + str(time.time() - startTime))
    print('URL: %s' % frame.baseUrl().toString())
    print('METADATA: %s' % frame.metaData())
    print('TAG: %s' % frame.documentElement().tagName())
    print('HTML: ' + frame.documentElement().toInnerXml())
    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://10.0.0.101/default.htm"))

startTime = time.time()
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_())

此代码为我提供了网站中所有iframe的源代码 我想将所有这些iframe附加到一个html文件中 这可能吗?

2 个答案:

答案 0 :(得分:1)

我已在answer you copied your code from的评论中部分回答了这个问题。你不能简单地将单独的html页面连接成一个页面 - html forrmat就是不能那样工作。

有些工具可以将完整的网页保存到单个文件中,但它们都使用特殊格式来执行此操作。其中一种格式是MHTML,这是一个记录为RFC 2557的建议标准。如果你简单地看一下它,你就会发现它比简单地将大块的html粘在一起要复杂得多。

如果你想正确地做到这一点,我建议你寻找一种支持MHTML等格式的工具。

答案 1 :(得分:0)

如果您只想连接所有页面的HTML,可以添加一个将包含所有html的属性,并获取html:

class Sp():
    all_html = ''

    def save(self, ok, frame=None):
        if frame is None:
            print ('main-frame')
            frame = self.webView.page().mainFrame()
        else:
            print('child-frame')
        self.all_html += frame.toHtml()
        print('Time: ' + str(time.time() - startTime))
        print('URL: %s' % frame.baseUrl().toString())
        print('METADATA: %s' % frame.metaData())
        print('TAG: %s' % frame.documentElement().tagName())
        print('HTML: ' + frame.documentElement().toInnerXml())
        print()

设置主Web框架的HTML可能不起作用,因为很多事情,例如跨域策略。如果您有兴趣,可以使用:

self.webView.page().mainFrame().setHtml(self.all_html)

或仅使用部分框架设置HTML。