Pracuję nad projektem skrobania internetowego. Jednym z witryn, z którymi pracuję, ma dane pochodzące z JavaScript.

Była sugestia na Jednym z moich wcześniejszych pytań że mogę bezpośrednio zadzwonić do JavaScript z Pythona, ale nie jestem pewien Jak to osiągnąć.

Na przykład: Jeśli funkcja JavaScript jest zdefiniowana jako: add_2(var,var2)

Jak nazwałbym funkcję JavaScript z Pythona?

37
Kiran 27 listopad 2011, 14:02

6 odpowiedzi

Najlepsza odpowiedź

Znajdź tłumacz JavaScript, który ma wiązania Pythona. (Wypróbuj nosorożec? V8? Seamonkey?). Kiedy znalazłeś jeden, powinien przyjść z przykładami, jak korzystać z Pythona.

Sam python nie obejmuje tłumacza JavaScript .

16
Has QUIT--Anony-Mousse 27 listopad 2011, 10:31

Aby wchodzić w interakcje z JavaScript z Pythona używam Webkit, który jest renderem przeglądarki za chromem i safari. Są Wiązania Python do WebKit przez QT. W szczególności istnieje funkcja do wykonywania JavaScript o nazwie ocena ().

Oto pełny przykład do wykonania JavaScript i wyodrębnij końcową HTML.

7
hoju 2 kwiecień 2015, 15:50

Ciekawa alternatywa, którą odkryłem ostatnio, jest python Moduł Bond, który może być używany do komunikacji Proces Nodejs (silnik V8).

Wykorzystanie byłoby bardzo podobne do pyv8 wiązania, ale możesz bezpośrednio Użyj dowolnej biblioteki Nodejs bez modyfikacji, co jest dla mnie głównym punktem sprzedaży.

Twój kod Pythona wyglądałby tak:

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

Lub nawet:

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

Funkcje dzwonienia jest jednak zdecydowanie wolniejsze niż Pyv8, więc znacznie zależy od Twoich potrzeb. Jeśli chcesz użyć pakietu npm, który robi wiele ciężkich podnoszenia, bond jest świetny. Możesz nawet mieć więcej procesów nodejów równolegle.

Ale jeśli wystarczy zadzwonić do kilku funkcji JS (na przykład, aby mieć te same funkcje walidacyjne między przeglądarką / backend), pyv8 na pewno będzie dużo szybsze.

6
user4038045 13 wrzesień 2014, 16:07

Możesz ostatecznie uzyskać JavaScript z strony i wykonać go za pomocą niektórych tłumacza (takich jak V8 lub Rhino). Jednak można uzyskać dobry wynik w sposób łatwiejszy dzięki korzystaniu z niektórych funkcjonalnych narzędzi do testowania, takich jak Selenium lub splinter. Rozwiązania te uruchamiają przeglądarkę i skutecznie ładują stronę - może być wolno, ale zapewnia, że dostępna była spodziewana przeglądarka treść.

Na przykład rozważ poniższy dokument 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>

Poniższy skrypt będzie używać drzby. Splinter uruchomi Firefoksa i po pełnym obciążeniu strony otrzyma treść dodana do div przez 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()

Rezultatem będzie zawartość wydrukowana w Stdout.

2
c24b 1 kwiecień 2015, 14:37

Możesz nazwać węzłem przez Popen.

Mój przykład, jak to zrobić

print execute('''function (args) {
    var result = 0;
    args.map(function (i) {
        result += i;
    });
    return result;
}''', args=[[1, 2, 3, 4, 5]])
2
mosquito 17 październik 2017, 19:17

Czy ostatnio wykonał cały spływ różnych metod.

Pyqt4 węzeł.js / zombie.js fantomjs

Phantomjs był zwycięzcą, bardzo prosty z dużą ilością przykładów.

-1
frage 18 kwiecień 2015, 08:30