2012-04-13 21 views
30

Ho pagine Web HTML che sto analizzando utilizzando xpath. Il etree.tostring di un certo nodo mi da questa stringa:Eseguendo Javascript da Python

<script> 
<!-- 
function escramble_758(){ 
    var a,b,c 
    a='+1 ' 
    b='84-' 
    a+='425-' 
    b+='7450' 
    c='9' 
    document.write(a+c+b) 
} 
escramble_758() 
//--> 
</script> 

Ho solo bisogno l'uscita di escramble_758(). Posso scrivere una regex per capire tutto, ma voglio che il mio codice rimanga in ordine. Qual è l'alternativa migliore?

Sto comprimendo le seguenti librerie, ma non ho visto una soluzione esatta. Molti di loro stanno cercando di emulare il browser, facendo rallentare le cose.

Edit: Un esempio sarà be great .. (barebones will do)

+0

Attendere. Questo è un dupe? O il Pigiama era abbastanza sbagliato che qualcuno ha cancellato la loro risposta? –

+1

Potrebbe essere [PhantomJS] (http://code.google.com/p/phantomjs/) può aiutare o [pyv8] (http://code.google.com/p/pyv8/). – RanRag

+0

@ErikReppen Ho controllato il pigiama, non ha esempi. – jerrymouse

risposta

28

Utilizzo di PyV8, posso farlo. Tuttavia, devo sostituire document.write con return perché non ci sono DOM e quindi non document.

import PyV8 
ctx = PyV8.JSContext() 
ctx.enter() 

js = """ 
function escramble_758(){ 
var a,b,c 
a='+1 ' 
b='84-' 
a+='425-' 
b+='7450' 
c='9' 
document.write(a+c+b) 
} 
escramble_758() 
""" 

print ctx.eval(js.replace("document.write", "return ")) 

Oppure si potrebbe creare un oggetto documento finto

class MockDocument(object): 

    def __init__(self): 
     self.value = '' 

    def write(self, *args): 
     self.value += ''.join(str(i) for i in args) 


class Global(PyV8.JSClass): 
    def __init__(self): 
     self.document = MockDocument() 

scope = Global() 
ctx = PyV8.JSContext(scope) 
ctx.enter() 
ctx.eval(js) 
print scope.document.value 
+0

Come installo PyV8? Quando eseguo un 'python setup.py install', ottengo _ERROR: dovresti impostare V8_HOME nella cartella di Google v8, oppure scaricarlo e crearlo prima. _ Quando visiti questo progetto, vedo solo 2 download, benchmarks-v2.zip benchmarks-v1.zip. Nessuno di loro ha alcun file py. – jerrymouse

+0

Ho appena usato l'installer exe perché sto usando Window. Non sono sicuro su come installarlo su altre piattaforme. – Dikei

+3

Sono su mac .. A volte le finestre sono così belle .. – jerrymouse

18

È inoltre possibile utilizzare Js2Py che è scritto in puro python ed è in grado sia di eseguire e tradurre javascript per python. Supporta praticamente tutto JavaScript, persino etichette, getter, setter e altre funzionalità raramente utilizzate.

import js2py 

js = """ 
function escramble_758(){ 
var a,b,c 
a='+1 ' 
b='84-' 
a+='425-' 
b+='7450' 
c='9' 
document.write(a+c+b) 
} 
escramble_758() 
""".replace("document.write", "return ") 

result = js2py.eval_js(js) # executing JavaScript and converting the result to python string 

vantaggi di Js2Py includono portabilità ed estremamente facile integrazione con python (dato che fondamentalmente JavaScript è stato tradotto in python).

Per installare:

pip install js2py 
Problemi correlati