Подтвердить что ты не робот

Выполнение Javascript с Python

У меня есть веб-страницы HTML, которые я просматриваю с помощью xpath. etree.tostring определенного node дает мне эту строку:

<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(). Я могу написать регулярное выражение, чтобы выяснить все это, но я хочу, чтобы мой код оставался аккуратным. Какая лучшая альтернатива?

Я просматриваю следующие библиотеки, но я не видел точного решения. Большинство из них пытаются подражать браузеру, делая вещи улитки медленными.

Изменить: пример будет отличным.. (бабочки сделают)

4b9b3361

Ответ 1

Используя PyV8, я могу это сделать. Однако мне нужно заменить document.write на return, потому что там нет 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

Ответ 2

Вы также можете использовать Js2Py, который написан на чистом питоне и способен выполнять и переводить javascript на python. Поддерживает практически весь JavaScript даже ярлыки, геттеры, сеттеры и другие редко используемые функции.

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

Ответ 3

Еще одно решение, такое как 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")

И да, вы должны заменить document.write с return поскольку другие предложили