Comment appeler une fonction Javascript de Python?

je travaille sur un projet de grattage de toile. L'un des sites Web avec lesquels je travaille contient des données provenant de Javascript.

il y avait une suggestion sur une de mes questions précédentes que je peux appeler directement le Javascript de Python, mais je ne suis pas sûr de la façon d'accomplir ceci.

par exemple: si une fonction JavaScript est définie comme: add_2(var,var2)

comment appellerais-Je cette fonction JavaScript de Python?

30
demandé sur Steven Vascellaro 2011-11-27 14:02:44

6 réponses

trouver un interpréteur JavaScript qui a des fixations Python. (Essayez De Rhino? V8? SeaMonkey?). Lorsque vous en avez trouvé un, il doit être accompagné d'exemples d'utilisation de python.

Python lui-même, cependant, ne comprend pas un interpréteur JavaScript .

9
répondu Anony-Mousse 2011-11-27 10:31:35

pour interagir avec JavaScript de Python, j'utilise webkit, qui est le navigateur renderer derrière Chrome et Safari. Il y a des fixations Python à webkit via Qt . En particulier, il existe une fonction pour exécuter JavaScript appelée evaluateJavaScript() .

voici un exemple complet pour exécuter JavaScript et extraire le HTML final .

5
répondu hoju 2015-04-02 15:50:35

une alternative intéressante que j'ai découverte récemment est le module Python bond , qui peut être utilisé pour communiquer avec un processus NodeJs (moteur v8).

utilisation serait très similaire à la pyv8 reliures, mais vous pouvez directement utiliser toute bibliothèque NodeJs sans modification, ce qui est un point de vente majeur pour moi.

votre code python ressemblerait à ceci:

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

ou encore:

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

fonctions D'appel cependant est certainement plus lent que pyv8, donc il dépend grandement de vos besoins. Si vous avez besoin d'utiliser un npm paquet qui fait beaucoup de levage lourd, bond est génial. Vous pouvez même avoir plus de processus nodejs fonctionnant en parallèle.

mais si vous avez juste besoin d'appeler un tas de fonctions JS (par exemple, pour avoir les mêmes fonctions de validation entre navigateur/backend), pyv8 sera certainement beaucoup plus vite.

3
répondu user4038045 2014-09-13 16:07:20

vous pouvez éventuellement obtenir le JavaScript de la page et l'exécuter par un interprète (tel que V8 ou Rhino). Cependant, vous pouvez obtenir un bon résultat d'une manière plus facile en utilisant certains outils de test fonctionnels, tels que sélénium ou Splinter . Ces solutions lancent un navigateur et chargent efficacement la page - il peut être lent, mais assure que le contenu affiché de navigateur attendu sera disponible.

pour exemple, considérons le document HTML ci-dessous:

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

le script ci-dessous utilisera Splinter. Splinter lancera Firefox et après le chargement complet de la page il obtiendra le contenu ajouté à un div par 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()

le résultat sera le contenu imprimé dans le stdout.

2
répondu brandizzi 2015-04-01 14:37:14

a fait une révision complète des différentes méthodes récemment.

PyQt4 nœud.js / zombie.js phantomjs

Phantomjs a été le gagnant haut la main, très simple avec beaucoup d'exemples.

0
répondu frage 2015-04-18 08:30:04

vous pouvez appeler node par Popen.

mon exemple comment le faire

print execute('''function (args) {
    var result = 0;
    args.map(function (i) {
        result += i;
    });
    return result;
}''', args=[[1, 2, 3, 4, 5]])
0
répondu mosquito 2017-10-17 19:17:31