首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Python执行Javascript

从Python执行Javascript
EN

Stack Overflow用户
提问于 2012-04-13 14:39:41
回答 6查看 143.6K关注 0票数 61

我有用xpath抓取的HTML网页。某个节点的etree.tostring给出了这个字符串:

<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()的输出。我可以编写一个正则表达式来解决整个问题,但我希望我的代码保持整洁。最好的选择是什么?

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

编辑:举个例子就好了..(赤裸裸的就可以了)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-04-13 15:07:57

使用PyV8,我可以做到这一点。但是,我必须用return替换document.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 "))

或者,您可以创建一个模拟文档对象

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
票数 50
EN

Stack Overflow用户

发布于 2015-05-30 03:08:35

您也可以使用Js2Py,它是用纯python编写的,可以执行javascript并将其转换为python。支持几乎整个JavaScript,甚至标签、getters、setters和其他很少使用的特性。

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
票数 57
EN

Stack Overflow用户

发布于 2018-03-21 17:16:53

另一个解决方案是PyV8似乎没有得到维护,并且依赖于旧版本的libv8。

PyMiniRacer它是一个围绕v8引擎的包装器,它可以与新版本一起工作,并得到积极维护。

pip install py-mini-racer

from py_mini_racer import py_mini_racer
ctx = py_mini_racer.MiniRacer()
ctx.eval("""
function escramble_758(){
    var a,b,c
    a='+1 '
    b='84-'
    a+='425-'
    b+='7450'
    c='9'
    return a+c+b;
}
""")
ctx.call("escramble_758")

是的,您必须按照其他人的建议用return替换document.write

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10136319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档