如何从Python调用Javascript函数?

Kir*_*ran 32 javascript python web-scraping

我正在开展网络抓取项目.我正在使用的其中一个网站的数据来自Javascript.

我之前的一个问题有一个建议,我可以直接从Python调用Javascript,但我不知道如何实现这一点.

例如:如果JavaScript函数定义为: add_2(var,var2)

我如何从Python调用该JavaScript函数?

Ano*_*sse 10

查找具有Python绑定的JavaScript解释器.(试试Rhino?V8?SeaMonkey?).当你找到一个时,它应该带有如何从python中使用它的例子.

但是,Python本身不包含JavaScript解释器.

  • 你一定要查看[pyv8](http://code.google.com/p/pyv8/),它为谷歌的V8引擎提供了一个python包装器.[This](http://devzone.zend.com/1480/using-javascript-in-php-with-pecl-and-spidermonkey/)包含有关在SpiderMonkey中使用python的信息.希望这可以帮助. (4认同)
  • 如果你想支持多个JavaScript引擎,你应该看一下[PyExecJS](https://pypi.python.org/pypi/PyExecJS) (3认同)

hoj*_*oju 5

要从Python与JavaScript交互,我使用webkit,它是Chrome和Safari背后的浏览器渲染器.通过Qt对webkit进行Python绑定.特别是有一个执行JavaScript的函数,名为evaluateJavaScript().

这是一个执行JavaScript并提取最终HTML的完整示例.


小智 5

我最近发现的一个有趣的替代方法是Python bond模块,该模块可用于与NodeJs进程(v8引擎)进行通信。

用法与pyv8绑定非常相似,但是您可以直接使用任何NodeJs库而无需进行修改,这对我来说是一个主要卖点。

您的python代码如下所示:

val = js.call('add2', var1, var2)
Run Code Online (Sandbox Code Playgroud)

甚至:

add2 = js.callable('add2')
val = add2(var1, var2)
Run Code Online (Sandbox Code Playgroud)

调用函数绝对比pyv8慢,因此它很大程度上取决于您的需求。如果您需要使用npm繁重的包装,那就bond太好了。您甚至可以让更多的nodejs进程并行运行。

但是,如果您只需要调用一堆JS函数(例如,在浏览器/后端之间具有相同的验证函数),pyv8则肯定会快很多。