web-dev-qa-db-fra.com

Comment appeler une fonction Javascript à partir de Python?

Je travaille sur un projet de Web-scraping. L'un des sites Web sur lequel je travaille a les données provenant de Javascript.

Il a été suggéré sur une de mes questions précédentes que je puisse appeler directement le code Javascript depuis Python, mais je ne sais pas comment y parvenir.

Par exemple: Si une fonction JavaScript est définie comme suit: add_2(var,var2)

Comment pourrais-je appeler cette fonction JavaScript à partir de Python?

31
Kiran

Recherchez un interpréteur JavaScript doté de liaisons Python. (Essayez Rhino? V8? SeaMonkey?). Lorsque vous en avez trouvé un, il devrait contenir des exemples d'utilisation de python.

Cependant, Python n’inclut pas d’interprète JavaScript .

9
Anony-Mousse

Pour interagir avec JavaScript depuis Python, j'utilise webkit, le moteur de rendu du navigateur derrière Chrome et Safari. Il existe des liaisons Python à webkit via Qt . En particulier, il existe une fonction d'exécution de JavaScript appelée assessmentJavaScript () .

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

5
hoju

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

L'utilisation serait très similaire aux liaisons pyv8 , mais vous pouvez utiliser directement n'importe quelle bibliothèque NodeJs sans modification, ce qui est un argument de vente majeur pour moi.

Votre code python ressemblerait à ceci:

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

ou même:

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

L'appel des fonctions est bien plus lent que pyv8, cela dépend donc beaucoup de vos besoins. Si vous devez utiliser un paquetage npm qui soulève beaucoup de problèmes, bond est excellent. Vous pouvez même avoir plus de processus nodejs s'exécutant 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 le navigateur/le backend), pyv8 sera définitivement beaucoup plus rapide.

4
user4038045

Vous pouvez éventuellement obtenir le code JavaScript de la page et l'exécuter via un interpréteur (tel que v8 ou Rhino). Cependant, vous pouvez obtenir un bon résultat plus facilement en utilisant des outils de test fonctionnels, tels que Selenium ou Splinter . Ces solutions lancent un navigateur et chargent efficacement la page. Cela peut être lent mais garantit que le contenu attendu du navigateur affiché sera disponible.

Par 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, le contenu sera ajouté à une 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 la sortie standard.

2
brandizzi

Vous pouvez appeler node via 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
mosquito

A fait un tour complet des différentes méthodes récemment. 

PyQt4 Node.js/zombie.js Phantomjs

Phantomjs était le vainqueur haut la main, très simple avec de nombreux exemples.

0
frage