0

Python、PyQt4、およびQtWebKitを使用して、データを調べるために必要最低限​​のブラウザーにWebページをロードしています。

ただし、小さな問題があります。ロードされたページのすべてのiframeのコンテンツとsrcを取得しようとしています。フレームを取得するためにwebView.page()。mainFrame()。childFrames()を使用しています。問題は、childFrames()は、ブラウザに表示されている場合にのみフレームをロードすることです。たとえば、ブラウザがページの上部にある場合、childFrames()はページのフッターにあるiframeをロードしません。すべての広告を取得できる場所を微調整できる方法や設定はありますか?「ブラウザ」のソースを添付しました。ページの読み込みが完了したら、下にスクロールしてみてください。コンソールを見ると、iframeが動的に読み込まれることがわかります。助けてください。

from PyQt4 import QtGui, QtCore, QtWebKit
import sys
import unicodedata


class Sp():
    def Main(self):
        self.webView = QtWebKit.QWebView()
        self.webView.load(QtCore.QUrl("http://www.msnbc.msn.com/id/41197838/ns/us_news-environment/"))
        self.webView.show()
        QtCore.QObject.connect(self.webView,QtCore.SIGNAL("loadFinished(bool)"),self.Load)


def Load(self):
    frame = self.webView.page().mainFrame()
    children = frame.childFrames()
    fT = []


    for x in children:
        print "=========================================="
        print unicodedata.normalize('NFKD', unicode(x.url().toString())).encode('ascii','ignore')
        print "=========================================="
        fT.append([unicode(x.url().toString()),unicode(x.toHtml()),[]])


    for x in range(len(fT)):
        f = children[x]
        tl = []
        for fx in f.childFrames():
            print "___________________________________________"
            print unicodedata.normalize('NFKD', unicode(fx.url().toString())).encode('ascii','ignore')
            print "___________________________________________"
            tl.append([unicode(fx.url().toString()),unicode(fx.toHtml()),[]])
        fT[x][2] = tl


app = QtGui.QApplication(sys.argv)
s = Sp()
s.Main()
app.exec_()
4

1 に答える 1

0

実行していることを実行している理由はわかりませんが、表示されているものだけをロードしている場合は、ページビューポートのサイズをコンテンツサイズに設定すると、すべてがロードされます。

def Load(self):
    self.webView.page().setViewportSize(
        self.webView.page().mainFrame().contentsSize())

ただし、これはGUIで奇妙な効果をもたらすため、このソリューションは、実行しようとしていることに対して受け入れられない可能性があります。

于 2011-04-27T23:55:03.663 に答える