0

現在、Python スクリプトを実行しており、指定されたユーザーを Web ページにログインさせ、ログイン後にサイトの別のページに移動しています。私が目指しているのは、読み込みが完了した後に最終ページの生の HTML を取得することです。Render クラスのさまざまなバリエーションを試しましたが、「フレームは Render の属性ではありません」というエラーが発生するようです。私が言ったように、私の主な目標は、ページの HTML を取得することです。私は何を間違っていますか?

url = "https://firstwebpage.com/"
url3 = "https://finaldestinationpage.com" #the page that I want the HTML from
username = "username"
password = "password"




import sys, signal

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

class Render(QWebPage):
    def __init__(self, app, url):
         QWebPage.__init__(self)
         self.loadFinished.connect(self._loadFinished)
         self.mainFrame().load(QUrl(url))
         app.exec_()

    def _loadFinished(self, result):
         self.frame = self.mainFrame()


def JSEval(code):
    return webpage.mainFrame().evaluateJavaScript(code)

def onLoadStarted():
    print("Loading started: %s" % webpage.mainFrame().url().toString())

def onLoadFinished(result):

    print("Loading finished: %s" % webpage.mainFrame().url().toString())
    if not result:
        print("Request failed")
        return

    JSEval("_form = document.getElementsByName('loginForm')[0];")

    JSEval("_form.username.value='%s';" % username \
        + "_form.password.value='%s';" % password \
        + "_form.submit();")
    print("Login data sent")
    if webpage.mainFrame().url().toString() == url3:
        r = Render(app,url3)  
        html = r.frame.toHtml()  #Here is where the "frame" error comes in
        print(html)



app = QApplication(sys.argv)
signal.signal(signal.SIGINT, signal.SIG_DFL)
webpage = QWebPage()
webpage.connect(webpage, SIGNAL("loadFinished(bool)"), onLoadFinished)
webpage.connect(webpage, SIGNAL("loadStarted()"), onLoadStarted)
webpage.mainFrame().load(QUrl(url))   #where user is initally logged in
webpage.mainFrame().load(QUrl(url3))
web = QWebView()
web.setPage(webpage)
web.show()


sys.exit(app.exec_())
4

1 に答える 1

0

Renderクラスではframe、 のハンドラーに属性を設定しますloadFinishedが、それを使用すると、インスタンスを作成した直後にアクセスしようとしRenderます。その時までに、ページがまだロードされていない可能性が非常に高いため、シグナルが発生していないため、r.frameまだ終了していません。

ページの html コンテンツを取得する場合は、ページの読み込みが完了した後にのみ実行できるため、シグナル ハンドラーで実行することをお勧めします。

ああ、あなたは電話をかけるべきではありませapp.exec_()Render.__init__

于 2013-09-05T19:52:03.077 に答える