Вопрос по python, javascript – Выполнение Javascript из Python

37

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

<code><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>
</code>

Мне просто нужен выводescramble_758(), Я могу написать регулярное выражение, чтобы выяснить все это, но я хочу, чтобы мой код оставался аккуратным. Какова лучшая альтернатива?

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

http://code.google.com/p/python-spidermonkey/ (clearly says it's not yet possible to call a function defined in Javascript) http://code.google.com/p/webscraping/ (don't see anything for Javascript, I may be wrong) http://pypi.python.org/pypi/selenium (Emulating browser)

Редактировать:An example will be great.. (barebones will do)

@RanRag попросит вас показать пример, если это возможно. jerrymouse
Может бытьPhantomJS может помочь илиpyv8. RanRag
Я удалил это, потому что я понял, что это было довольно неправильно. Karl Knechtel
@ErikReppen Я проверил пижаму, у нее нет примеров. jerrymouse
Подождите. Это дурак? Или пижама была настолько неправа, что кто-то удалил их ответ? Erik Reppen

Ваш Ответ

4   ответа
32

который написан на чистом python и может выполнять и переводить 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
Error: User Rate Limit Exceeded
1
,

чтобы выполнить свой js-код и получить вывод из document.write с фиктивным объектом документа:

import js2py

js = """
var output;
document = {
    write: function(value){
        output = value;
    }
}
""" + your_script

context = js2py.EvalJs()
context.execute(js)
print(context.output)
31

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
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded jerrymouse
Error: User Rate Limit Exceededpython setup.py installError: User Rate Limit ExceededERROR: you should set V8_HOME to the Google v8 folder, or download and build it first. <code.google.com/p/v8Error: User Rate Limit ExceededError: User Rate Limit Exceeded jerrymouse
11

так как 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 как предлагали другие

Похожие вопросы