2012-06-19 7 views
5

Asumamos que tenemos PyV8:PyV8, ¿puedo manipular la estructura DOM?

import PyV8 
ctxt = PyV8.JSContext() 

y una estructura pitón DOM, por ejemplo xml.dom

¿Cómo puedo alimentar a una Js-archivo a PyV8 para que pudiera cambiar DOM-estructura que me tener.
Si tuviera muestra su contenido:

$("#id").remove(); 

Quiero elemento DOM para ser retirado.

PyV8 tiene perfecto ejemplo de hello-world. Pero me gustaría ver algo útil.

Para que quede claro, lo que yo quiero hacer es:
"Javascript file" -> - magia -> - DOM, (already built with html file) and changed now with passed javascript file

Respuesta

2

appologies para el formato. Espacié lo mejor que pude, pero a mi lector de pantalla no le gustan los controles de formato de SO.

Voy a tomar una oportunidad para responder a su pregunta, aunque parece un poco vago. Por favor, avíseme si necesito reescribir esta respuesta para adaptarse a una situación diferente. Supongo que está intentando obtener un archivo HTML de la web y ejecutar Javascript desde este archivo para actuar sobre dicho documento. Desafortunadamente, ninguna de las bibliotecas de Python xml tiene compatibilidad con DOM verdadero, y el cumplimiento de W3C DOM no existe en cada paquete que he encontrado. Lo que puede hacer es usar el archivo dom PyV8 w3c.py como un ejemplo inicial y crear su propio DOM completo. W3C Sample Dom Sin embargo, tendrá que volver a escribir este módulo, ya que no respeta las comillas o los apostrophys. BeautifulSoup tampoco es el analizador más rápido. Recomendaría usar algo como la opción del analizador de destino de lxml.etree. LXML Target Parser Buscar "La interfaz del analizador de fuentes". Luego, puede cargar un documento HTML/Script con LXML, analizarlo como se indica a continuación, y ejecutar cada uno de los scripts que necesita en el DOM creado.

Encuentre un ejemplo parcial a continuación. (Tenga en cuenta que los estándares HTML son masivos, dispersos y específicos del navegador, por lo que su kilometraje puede variar).

class domParser(object): 
    def __init__(self): 
    #initialize dom object here, and obtain the root for the destination file object. 
     self.dom = newAwesomeCompliantDom() 
     self.document = self.dom.document 
     self.this = self.document 

    def comment(self, commentText): 
    #add commentText to self.document or the above dom object you created 
     self.this.appendChild(self.document.DOMImplementation.createComment(commentText)) 

    def start(self, tag, attrs): 
    #same here 
     self.this = self.this.appendChild(self.document.DOMImplimentation.newElement(tag,attrs)) 

    def data(self, dataText): 
    #append data to the last accessed element, as a new Text child 
     self.this.appendChild(self.document.DOMImpl.createDataNode(dataText)) 

    def end(self): 
    #closing element, so move up the tree 
     self.this = self.this.parentNode 

    def close(self): 
     return self.document 

#unchecked, please validate yourself 
x = lxml.etree.parse(target=domParser) 
x.feed(htmlFile) 
newDom = x.close() 
+0

Pero, como yo lo entendí, solo construye dom. No puedo alimentar el archivo javascript para ejecutarlo en un dom listo, ¿o sí? – Sergey

4

Un buen ejemplo de lo que estamos tratando de hacer se puede encontrar aquí:

https://github.com/buffer/thug

Es un cliente pitón http ejecución de JS a través de PyV8 con fines de investigación de seguridad, pero puede amarrarse abajo fácilmente para necesidades más simples.

Cuestiones relacionadas