从Python执行Javascript

我有我使用xpath爬行的HTML网页。 某个节点的etree.tostring给了我这个string:

 <script> <!-- function escramble_758(){ var a,b,c a='+1 ' b='84-' a+='425-' b+='7450' c='9' document.write(a+c+b) } escramble_758() //--> </script> 

我只需要escramble_758()的输出。 我可以写一个正则expression式来弄清楚整个事情,但是我希望我的代码保持整洁。 什么是最好的select?

我通过下面的库压缩,但我没有看到一个确切的解决scheme。 他们中的大多数都在试图模拟浏览器,使得事情变得缓慢。

  • http://code.google.com/p/python-spidermonkey/ (清楚地说, it's not yet possible to call a function defined in Javascript
  • http://code.google.com/p/webscraping/ (没有看到任何的Javascript,我可能是错的)
  • http://pypi.python.org/pypi/selenium (仿真浏览器)

编辑: 一个例子将是伟大的..(准系统会做)

使用PyV8 ,我可以做到这一点。 但是,我必须用return来replacedocument.write ,因为没有DOM,因此没有document

 import PyV8 ctx = PyV8.JSContext() ctx.enter() js = """ function escramble_758(){ var a,b,c a='+1 ' b='84-' a+='425-' b+='7450' c='9' document.write(a+c+b) } escramble_758() """ print ctx.eval(js.replace("document.write", "return ")) 

或者你可以创build一个模拟文档对象

 class MockDocument(object): def __init__(self): self.value = '' def write(self, *args): self.value += ''.join(str(i) for i in args) class Global(PyV8.JSClass): def __init__(self): self.document = MockDocument() scope = Global() ctx = PyV8.JSContext(scope) ctx.enter() ctx.eval(js) print scope.document.value 

你也可以使用纯Python编写的Js2Py,并且能够执行和翻译javascript到python。 支持几乎整个JavaScript甚至标签,getters,setter和其他很less使用的function。

 import js2py js = """ function escramble_758(){ var a,b,c a='+1 ' b='84-' a+='425-' b+='7450' c='9' document.write(a+c+b) } escramble_758() """.replace("document.write", "return ") result = js2py.eval_js(js) # executing JavaScript and converting the result to python string 

Js2Py的优点包括便携性和与Python非常容易的集成(因为基本上JavaScript被转换为python)。

安装:

 pip install js2py