如何从Python调用Javascript函数

How do I call a Javascript function from Python?

本文关键字:Javascript 函数 调用 Python      更新时间:2023-09-26

我正在做一个网页抓取项目。我正在工作的一个网站有来自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是轻而易举的赢家,非常简单,有很多例子。