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

Как я могу назвать функцию Javascript из Python?

Я работаю над проектом веб-соскабливания. На одном из сайтов, с которыми я работаю, есть данные, поступающие из Javascript.

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

Например: если функция JavaScript определена как: add_2(var,var2)

Как я могу назвать эту функцию JavaScript из Python?

4b9b3361

Ответ 1

Найдите интерпретатор JavaScript с привязкой к Python. (Попробуйте Rhino? V8? SeaMonkey?). Когда вы его нашли, он должен прийти с примерами того, как использовать его из python.

Сам Python не включает в себя интерпретатор JavaScript.

Ответ 2

Чтобы взаимодействовать с JavaScript из Python, я использую webkit, который является обозревателем браузера за Chrome и Safari. Есть привязки Python к webkit через Qt. В частности, существует функция для выполнения JavaScript под названием оценкаJavaScript().

Вот полный пример для выполнения JavaScript и извлечения окончательного HTML.

Ответ 3

Интересной альтернативой, которую я недавно обнаружил, является модуль Python bond, который может использоваться для связи с процессом NodeJs (движок v8).

Использование будет очень похоже на привязки pyv8, но вы можете напрямую использовать любую библиотеку NodeJs без изменений, что является крупной продажей для меня.

Ваш код на Python будет выглядеть следующим образом:

val = js.call('add2', var1, var2)

или даже:

add2 = js.callable('add2')
val = add2(var1, var2)

Функции вызова, хотя определенно медленнее, чем pyv8, так что это сильно зависит от ваших потребностей. Если вам нужно использовать пакет npm, который делает много тяжелой работы, bond отлично. Вы можете даже запустить несколько процессов nodejs параллельно.

Но если вам просто нужно вызвать кучу JS-функций (например, чтобы иметь одни и те же функции проверки между браузером /backend ), pyv8 определенно будет намного быстрее.

Ответ 4

В конечном итоге вы можете получить JavaScript со страницы и выполнить ее через некоторый интерпретатор (например, v8 или Rhino). Тем не менее, вы можете получить хороший результат способом проще, используя некоторые функциональные инструменты тестирования, такие как Selenium или Splinter. Эти решения запускают браузер и эффективно загружают страницу - он может быть медленным, но гарантирует, что ожидаемый отображаемый контент браузера будет доступен.

Например, рассмотрим документ HTML ниже:

<html>
    <head>
        <title>Test</title>
        <script type="text/javascript">
            function addContent(divId) {
                var div = document.getElementById(divId);
                div.innerHTML = '<em>My content!</em>';
            }
        </script>
    </head>
    <body>
        <p>The element below will receive content</p>
        <div id="mydiv" />
        <script type="text/javascript">addContent('mydiv')</script>
    </body>
</html>

В приведенном ниже script будет использоваться Splinter. Splinter запустит Firefox, и после полной загрузки страницы он получит содержимое, добавленное в div по JavaScript:

from splinter.browser import Browser
import os.path

browser = Browser()
browser.visit('file://' + os.path.realpath('test.html'))
elements = browser.find_by_css("#mydiv")
div = elements[0]
print div.value

browser.quit()

Результатом будет содержимое, напечатанное в стандартном файле.

Ответ 5

В последнее время произошел целый ряд разных методов.

PyQt4 node.js/zombie.js phantomjs

Phantomjs был победителем раздачи, очень простой с большим количеством примеров.

Ответ 6

Вы можете вызвать node через Popen.

Мой пример, как это сделать

print execute('''function (args) {
    var result = 0;
    args.map(function (i) {
        result += i;
    });
    return result;
}''', args=[[1, 2, 3, 4, 5]])