web-dev-qa-db-ja.com

PythonからJavascript関数を呼び出すにはどうすればよいですか?

私はウェブスクレイピングプロジェクトに取り組んでいます。私が作業しているWebサイトの1つに、Javascriptからのデータがあります。

以前の質問の1つ から、PythonからJavascriptを直接呼び出すことができるという提案がありましたが、これを実現する方法がわかりません。

例:JavaScript関数がadd_2(var,var2)として定義されている場合

そのJavaScript関数をPythonからどのように呼び出すのですか?

32
Kiran

Pythonバインディングを持つJavaScriptインタープリターを見つけてください。(Rhinoを試してみてください?V8?SeaMonkey?)。

ただし、Python自体にはJavaScriptインタープリターは含まれていません。

9
Anony-Mousse

最近発見した興味深い代替手段はPython bond モジュールで、NodeJsプロセス(v8エンジン)との通信に使用できます。

使用法は pyv8 バインディングに非常に似ていますが、直接修正なしで任意のNodeJsライブラリを使用できます。これはメジャーです私にとってのセールスポイント。

pythonコードは次のようになります。

val = js.call('add2', var1, var2)

あるいは:

add2 = js.callable('add2')
val = add2(var1, var2)

ただし、関数の呼び出しはpyv8よりも明らかに遅いため、ニーズに大きく依存します。多くの面倒な作業を行うnpmパッケージを使用する必要がある場合は、bondが最適です。さらに多くのnodejsプロセスを並行して実行することもできます。

ただし、多数のJS関数を呼び出す必要がある場合(たとえば、ブラウザー/バックエンド間で同じ検証関数を使用する場合)、pyv8は間違いなくずっと速くなります。

5
user4038045

PythonからJavaScriptと対話するには、ChromeおよびSafariの背後にあるブラウザーレンダラーであるwebkitを使用します。 Qtを介したWebkitへの Pythonバインディングがあります 。特に、 evaluateJavaScript() というJavaScriptを実行するための関数があります。

JavaScriptを実行して最終的なHTMLを抽出する完全な の例を次に示します

5
hoju

最終的にはページからJavaScriptを取得し、インタープリター(v8やRhinoなど)を介して実行できます。ただし、 SeleniumSplinter などのいくつかの機能テストツールを使用すると、簡単な方法で良い結果を得ることができます。これらのソリューションはブラウザを起動し、ページを効果的にロードします-遅くなる可能性がありますが、期待されるブラウザ表示コンテンツが利用可能であることを保証します。

たとえば、次のHTMLドキュメントを考えます。

<html>
    <head>
        <title>Test</title>
        <script type="text/javascript">
            function addContent(divId) {
                var div = document.getElementById(divId);
                div.innerHTML = '<em>My content!</em>';
            }
        </script>
    </head>
    <body>
        <p>The element below will receive content</p>
        <div id="mydiv" />
        <script type="text/javascript">addContent('mydiv')</script>
    </body>
</html>

以下のスクリプトはSplinterを使用します。 SplinterはFirefoxを起動し、ページの読み込みが完了すると、JavaScriptによってdivにコンテンツが追加されます。

from splinter.browser import Browser
import os.path

browser = Browser()
browser.visit('file://' + os.path.realpath('test.html'))
elements = browser.find_by_css("#mydiv")
div = elements[0]
print div.value

browser.quit()

結果は、stdoutに印刷されたコンテンツになります。

2
brandizzi

Popenを介してノードを呼び出すことができます。

それを行う方法の例

print execute('''function (args) {
    var result = 0;
    args.map(function (i) {
        result += i;
    });
    return result;
}''', args=[[1, 2, 3, 4, 5]])
0
mosquito

最近、さまざまな方法の全体的な要約を行いました。

PyQt4 node.js/zombie.js phantomjs

Phantomjsが勝者であり、多くの例で非常に簡単です。

0
frage