Как мне вызвать функцию Javascript из Python? - PullRequest
32 голосов
/ 27 ноября 2011

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

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

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

Как бы я вызвал эту функцию JavaScript из Python?

Ответы [ 6 ]

9 голосов
/ 27 ноября 2011

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

Сам Python, однако, не включает интерпретатор JavaScript .

5 голосов
/ 13 сентября 2014

Недавно я обнаружил интересную альтернативу - модуль 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 (например, чтобы иметь одинаковые функции проверки между браузером / бэкэндом), pyv8 определенно будет намного быстрее.

5 голосов
/ 03 декабря 2011

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

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

2 голосов
/ 03 декабря 2011

Вы можете в конечном итоге получить 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>

В приведенном ниже сценарии будет использоваться 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()

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

0 голосов
/ 30 сентября 2015

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

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

print execute('''function (args) {
    var result = 0;
    args.map(function (i) {
        result += i;
    });
    return result;
}''', args=[[1, 2, 3, 4, 5]])
0 голосов
/ 18 апреля 2015

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

PyQt4 Node.js / zombie.js phantomjs

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...