从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