2016-02-25 55 views
1

我想在js執行後獲取網站的DOM。 我也希望獲得網站中iframe的所有內容,與我在Google Chrome的Inspect Element功能中獲得的內容類似。如何獲取網頁的html dom及其框架

這是我的代碼:

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,而不是I幀裏面的HTML。有什麼方法可以獲取iframe的HTML嗎?

回答

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信號是非常重要的。如果你連接到後者,如果頁面包含多個幀,它將被多次調用。

+0

是否有任何方法可以將所有加載到一個html文件中的幀附加到後面? – yuval

+0

@yuval。不,每一個都是一個單獨的html文檔。這實際上就是使用框架的關鍵 - 這樣就可以將一個網頁嵌入到另一個網頁中。但是如果你想保存*完整*網頁,框架只是問題的一部分 - 你還需要獲取所有的腳本,樣式表,圖像等等。大多數現代瀏覽器都有內置的工具來完成此操作。在Firefox中,它是File> Save Page As> Web Page,完成。這將創建一個單獨的html文檔,以及一個包含大量關聯文件的目錄。 – ekhumoro