簡體   English   中英

如何獲取網頁及其框架的html dom

[英]How to get the html dom of a webpage and its frames

我想在執行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 主框架的信號,而不是網絡的視圖。 如果您連接到后者,則該頁面包含多個框架時,它將被多次調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM