如何从Python调用Javascript函数
How do I call a Javascript function from Python?
我正在做一个网页抓取项目。我正在工作的一个网站有来自Javascript的数据。
关于我之前的一个问题,有人建议我可以直接从Python调用Javascript,但我不确定如何实现这一点。
例如:如果一个JavaScript函数定义为:add_2(var,var2)
我如何从Python调用JavaScript函数?
查找具有Python绑定的JavaScript解释器。(试着犀牛?V8吗?SeaMonkey吗?)当你找到一个时,它应该提供如何从python中使用它的示例。
Python本身不包含JavaScript解释器。
我最近发现的一个有趣的替代方案是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
肯定会快得多。
为了与Python中的JavaScript交互,我使用webkit,这是Chrome和Safari背后的浏览器渲染器。Python可以通过Qt绑定到webkit,特别是有一个用于执行JavaScript的函数叫做evaluateJavaScript()。
下面是执行JavaScript并提取最终HTML的完整示例。
您可以使用pythonmonkey
从Python执行JavaScript代码或文件。
安装:$ pip install pythonmonkey
的例子:
js_code = """
function add(a, b) {
return a + b;
}
function subtract(a, b) {
return a - b;
}
"""
import pythonmonkey as pm
pm.eval(js_code)
js_add = pm.eval('add')
js_sub = pm.eval('subtract')
print(js_add(1,2)) # 3.0
print(js_sub(1,2)) # -1.0
或者你可以使用commonjs语法要求一个文件或模块:
import pythonmonkey as pm
CryptoJS = pm.require('crypto-js')
...
您最终可以从页面中获取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()
结果将是在标准输出中打印的内容。
可以通过Popen调用node
我的例子如何做
print execute('''function (args) {
var result = 0;
args.map(function (i) {
result += i;
});
return result;
}''', args=[[1, 2, 3, 4, 5]])
嗨,所以一个可能的解决方案是使用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>
Python代码: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/
pip install js2py
pip install temp
file.py
import js2py
eval_res, tempfile = js2py.run_file("scripts/dev/test.js")
tempfile.wish("GeeksforGeeks")
scripts/dev/test.js
function wish(name) {
console.log("Hello, " + name + "!")
}
最近对不同的方法做了一个全面的概述。
PyQt4node . js/zombie.jsphantomjs
Phantomjs是轻而易举的赢家,非常简单,有很多例子。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 正在全局范围中查找JavaScript函数
- 如何将输入(type=text)从html表单传递到javascript函数
- 如何调用这个匿名 JavaScript 函数
- 通过Ajax将JavaScript函数传递给PHP文件
- 在javascript函数中设置全局变量
- 如何在执行此特定onclick事件时执行JavaScript函数
- 使用javascript函数在页面初始化后加载jquery
- javascript函数同步
- 如何将一个JavaScript函数回调为多个函数
- 在javascript函数中使用php变量
- 代码背后调用一个JavaScript函数的按钮点击-C#
- 将JavaScript函数与HTML分离
- 组合两个javascript函数
- 在 Java 中的 JavaScript 函数中插入 Wicket 值
- javascript函数内部的代码用逗号而不是分号分隔
- href属性内的javascript函数
- 使用html表单中的参数调用JavaScript函数
- 分析Javascript函数中的多个对象
- javascript函数的:和=之间的区别