簡體   English   中英

"如何從 Python 調用 Javascript 函數?"

[英]How do I call a Javascript function from Python?

我正在做一個網絡抓取項目。 我正在使用的其中一個網站的數據來自 Javascript。

我之前的一個問題<\/a>有一個建議,我可以直接從 Python 調用 Javascript,但我不知道如何實現這一點。

例如:如果一個 JavaScript 函數被定義為: add_2(var,var2)<\/code>

我將如何從 Python 調用該 JavaScript 函數?

查找具有 Python 綁定的 JavaScript 解釋器。 (試試 Rhino?V8?SeaMonkey?)。 當您找到一個時,它應該帶有如何從 python 使用它的示例。

然而,Python 本身並不包含JavaScript 解釋器

我最近發現的一個有趣的替代方案是 Python綁定模塊,它可用於與 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肯定會快很多。

為了從 Python 與 JavaScript 交互,我使用 webkit,它是 Chrome 和 Safari 背后的瀏覽器渲染器。 通過 Qt 到 webkit 的 Python 綁定 特別是有一個用於執行 JavaScript 的函數,稱為evaluateJavaScript()

這是執行 JavaScript 並提取最終 HTML的完整示例

您可以通過 Popen 調用節點。

我的例子怎么做

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

您最終可以從頁面中獲取 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()

結果將是打印在標准輸出中的內容。

嗨,所以一種可能的解決方案是使用 ajax 和flask 在javascript 和python 之間進行通信。 您將使用 Flask 運行服務器,然后在瀏覽器中打開網站。 通過這種方式,您可以在通過 pythoncode 創建網站或使用按鈕創建網站時運行 javascript 函數,在本示例中是如何完成的。

HTML代碼:



<html>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>


<script>
    function pycall() {
      $.getJSON('/pycall', {content: "content from js"},function(data) {
          alert(data.result);
      });
    }
</script>


<button type="button" onclick="pycall()">click me</button>
 

</html>

蟒蛇代碼:

from flask import Flask, jsonify, render_template, request

app = Flask(__name__)


def load_file(file_name):
    data = None
    with open(file_name, 'r') as file:
        data = file.read()
    return data

@app.route('/pycall')
def pycall():
    content = request.args.get('content', 0, type=str)
    
    print("call_received",content)
    return jsonify(result="data from python")

@app.route('/')
def index():
    return load_file("basic.html")



import webbrowser
print("opening localhost")
url = "http://127.0.0.1:5000/"
webbrowser.open(url)
app.run()

python中的輸出:

call_received content from js

瀏覽器中的警報:

data from python

最近對不同的方法進行了全面的分析。

PyQt4 node.js/zombie.js phantomjs

Phantomjs 是勝利者,非常簡單,有很多例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM