2

Webkit を使用して URL をロードし、Web ページからデータを抽出する小さな Web サーバーを作成しようとしています (例: タイトル、画像サイズなど)。

PythonからWebkitにアクセスするためにPyQt4を使用しています。リクエストごとに、次のような QThread を作成しています。 - QWebPage オブジェクトを作成します。 - イベント ループを実行します。 Qスレッド

これは、初めて Web ページがロードされ、そのすべてのリソース (CSS、画像) が含まれているときに非常にうまく機能します。2 回目にサーバーに URL をロードするように要求すると、Web ページはロードされますが、そのリソースはまったくロードされません (CSS も画像もありません)。そのため、画像サイズを取得しようとすると、すべてのサイズが 0,0 に設定されます。

ここにいくつかのコードスニップセットがあります:

# WebPage の読み込みを担当する QThread
クラス WebKitThread(QThread):
    def __init__(自己、URL):
        QThread.__init__(self)
        self.url = URL
        self.start()
    デフォルト実行 (自己):
        self.webkitParser = WebKitParser(self.url)
        self.exec_()

クラス WebKitParser(QWebPage):
    def __init__(self、url、parent=None):
        QWebPage.__init__(self, 親)
        self.loadFinished.connect(self._loadFinished)
        self.mainFrame().load(QUrl(url))

    def _loadFinished (自己、結果):
        self.computePageProperties()
        QThread.currentThread().exit()

    def computePageProperties(self):
        # タイトル、画像サイズを読み取るカスタム コード...
        self.computedTitle=XXXXXXXX

呼び出しコード (HTTP 要求に応答する) が実行されています。

t = WebKitThread(url)
t.wait()
# WebKitParser のプロパティを使って何かをする
print t.webkitParser.computedTitle
4

1 に答える 1

2

問題を修正することができました。GUI スレッド (QApplication イベント ループのスレッド) で QWebPage を作成すると、問題が修正されます。

QWebPage が 2 回目に使用されると、ブラウザーのキャッシュにアクセスしようとするようです (構成によって無効にされていても)。しかし、最初の QWebPage がメインの GUI スレッドで作成されなかった場合、キャッシュの構成が多少間違っており、使用できません。

メイン GUI スレッドで QWebPage を作成するために、QWebPage の初期化と結果のフェッチをトリガーするカスタム QEvent (ユーザー タイプの QEvent) を使用しています。

于 2011-02-03T11:20:54.533 に答える