[英]How do I call a python function from a cgi script with 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() 。
您可以通過 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)執行它。 但是,您可以通過使用一些功能測試工具(例如Selenium或Splinter )以更簡單的方式獲得良好的結果。 這些解決方案啟動瀏覽器並有效地加載頁面——它可能很慢,但可以確保預期的瀏覽器顯示內容可用。
例如,考慮下面的 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
這對我來說適用於簡單的 js 文件https:\/\/www.geeksforgeeks.org\/how-to-run-javascript-from-python\/<\/a>
pip install js2py
pip install temp
最近對不同的方法進行了全面的分析。
PyQt4 node.js/zombie.js phantomjs
Phantomjs 是勝利者,非常簡單,有很多例子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.