2017-01-26 23 views
3

動的コンテンツを取得する必要があります。これはajax js呼び出しによってロードされます。PyQtを使って動的コンテンツを取得する

PyQtの使い方は本当に分かりませんが、私はこれをやりたいと思っていました。

def render(source_html): 

    import sys 
    from PyQt5.QtCore import QEventLoop 
    from PyQt5.QtWidgets import QApplication 
    from PyQt5.QtWebEngineWidgets import QWebEngineView 

    class Render(QWebEngineView): 
     def __init__(self, html): 
      self.html = None 
      self.app = QApplication(sys.argv) 
      QWebEngineView.__init__(self) 
      self.loadFinished.connect(self._loadFinished) 
      self.setHtml(html) 

      while self.html is None: 
       self.app.processEvents(QEventLoop.ExcludeUserInputEvents | QEventLoop.ExcludeSocketNotifiers | QEventLoop.WaitForMoreEvents) 
      self.app.quit() 

     def _callable(self, data): 
      self.html = data 

     def _loadFinished(self, result): 
      self.page().toHtml(self._callable) 

    return Render(source_html).html 

import requests 
sample_html = requests.get('https://riverbankcomputing.com/software/pyqt/').text 
print(render(sample_html)) 

どのように私はその「onclickの」を実行してコンテンツを取得することができます?私はこの単純なコードを使用してのPyQtでページをレンダリングすることができます

<a href="#" id="id" onclick="A4J.AJAX.Submit('j_id0:j_id1:j_id110',event,{'similarityGroupingId':'j_id0:j_id1:j_id110:j_id582:0:j_id584'});return false;">NETHERLANDS</a>` 

:HTMLは次のようなものですか

答えて

1

これは、JavaScriptからのPyQtの機能を実行するには、古い質問が...

です:

これを行うためのさまざまな方法があるかもしれませんが、私はその後、QWebChannelを使用して、それを解決し、かつましたあなたのhtmlからjs関数を呼び出すのは、Webチャネルを使ってQtと通信するよりもです。

qwebchannel.jsが必要です。私は私のローカルマシン上のQt5 examplesディレクトリから私のものを得ました。同じファイルがWeb上の多くの場所に存在します。私はそれを見つけるためにそれをあなたに任せます。

この方法の多くは、ここで説明されて:あなたの__init__http://doc.qt.io/qt-5/qtwebchannel-javascript.html

、ウェブチャネルの作成:チャネルを使用するようにwebengineviewのメインページを設定し、あなたがしたいオブジェクトを登録し、その後

self.webchannel = QtWebChannel.QWebChannel(self) 

をセットアップウェブC、お使いの.js(またはあなたの.htmlのjavascriptのセクション)では

self.page().setWebChannel(self.webchannel) 
self.webchannel.registerObject('MyChannel', self) 

:PyQtはとjsの間で共有しますチャンネル:

var MyChannel = null; 
new QWebChannel(qt.webChannelTransport, function(channel) { 
       MyChannel = channel.objects.MyChannel; 
}); 

(これはqwebchannel.jsが出場します)あなたのjsまたはhtmlファイルにそれを含めることができなければなりません。私のために、他のjsを実行する前に<script src="scripts/qwebchannel.js"></script>をロードしました

jsからPyQtにチャンネル経由で電話するように設定されましたが、何を呼び出せますか? PyQtスロットとして装飾されているもの。

@QtCore.pyqtSlot(str) 
def foo(self, some_tring): 
    print ("Some string: %s" % game_data) 
:だから、例えば、場合、JavaScriptでは、あなたはそれが引数として文字列を受け取りレンダリングにおける「foo」という関数を呼び出してみたかった、そして次のような(レンダリングのメンバーとして)それを作成します

...そしてjsファイル(またはあなたのindex.html)で、単にMyChannel.foo('whatever')を呼び出してください。あなたはonclickとしてそれを行うことができます、またはあなたはonclickから呼び出す別の関数の本体から行うことができます。 MyChannel.foo('whatever')を通じて話す

:それはあなたが(Pythonで)チャンネルに登録したオブジェクト、そしてあなたがnew QWebChannelを作成したときにjsファイルで使用されている名前に割り当てられた名前だったので、あなたはMyChannelを呼び出します。登録を作成すると、登録するオブジェクトとしてselfが渡されました。したがって、MyChannelで識別されるチャンネルはRenderオブジェクトです。あなたはチャンネルを介してのみ信号を送ることができるので、あなたが「電話」するものはスロットでなければならないので、デコレータです。


また、PyQtからjs関数を呼び出す場合は、もう少し簡単です。あなたはそれが非同期と呼ばれていますので、それからの応答に何かをする必要がある場合はその場合、あなたは、単に

self.page().runJavaScript('someJsFunction("whatever");') 

を呼び出して、あなたはセットアップに応答ハンドラー必要があります

self.page().runJavaScript('someJsFunction("whatever");', self.__callback) 

を..コールバックを定義します(レンダリングのメンバーの可能性があります):

def __callback(self, response): 
    if response: 
     print ("Handling JS response: %s", response) 
関連する問題