2012-04-13 25 views
30

Tengo páginas web HTML que estoy rastreando usando xpath. El etree.tostring de un cierto nodo me da esta cadena:Ejecutando Javascript desde 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> 

Sólo necesito la salida de escramble_758(). Puedo escribir una expresión regular para descubrir todo, pero quiero que mi código permanezca ordenado. ¿Cuál es la mejor alternativa?

Estoy revisando las siguientes bibliotecas, pero no vi una solución exacta. La mayoría de ellos están tratando de emular el navegador, haciendo que las cosas se vuelvan más lentas.

Editar: Un ejemplo ser grandioso .. (los barebones lo harán)

+0

Esperar. ¿Esto es un engaño? ¿O era Pajamas lo suficientemente mal como para que alguien borrara su respuesta? –

+1

Puede ser [PhantomJS] (http://code.google.com/p/phantomjs/) puede ayudar o [pyv8] (http://code.google.com/p/pyv8/). – RanRag

+0

@ErikReppen Revisé el pijama, no tiene ejemplos. – jerrymouse

Respuesta

28

Usando PyV8, puedo hacer esto. Sin embargo, tengo que reemplazar document.write con return porque no hay DOM y por lo tanto no 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 ")) 

O bien, podría crear un documento objeto de burla

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

¿Cómo instalo PyV8? Cuando hago un 'python setup.py install', obtengo _ERROR: debes configurar V8_HOME en la carpeta de Google v8, o descargarlo y compilarlo primero. _ Al visitar este proyecto, acabo de ver 2 descargas, benchmarks-v2.zip benchmarks-v1.zip. Ninguno de ellos tiene ningún archivo py. – jerrymouse

+0

Solo uso el instalador exe porque estoy usando Window. No estoy seguro acerca de cómo instalarlo en otras plataformas. – Dikei

+3

Estoy en mac ... A veces las ventanas son tan geniales ... – jerrymouse

18

También puede utilizar Js2Py que está escrito en Python puro y es capaz de ejecutar tanto y traducir javascript para pitón. Admite JavaScript prácticamente completo, incluso etiquetas, getters, setters y otras funciones poco utilizadas.

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 

Ventajas de Js2Py incluyen la portabilidad y extremadamente fácil integración con el pitón (ya que básicamente JavaScript está siendo traducido al pitón).

Para instalar:

pip install js2py