2012-06-19 6 views
5

lascia supporre che abbiamo PyV8:PyV8, posso manipolare la struttura DOM?

import PyV8 
ctxt = PyV8.JSContext() 

e una struttura pitone DOM, ad esempio xml.dom

Come posso alimentare un js-file per PyV8 in modo da poter cambiare DOM-struttura che ho avere.
Se avessi avuto il suo contenuto:

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

voglio elemento dom da rimuovere.

PyV8 ha un perfetto esempio di ciao-mondo. Ma mi piacerebbe vedere qualcosa di utile.

Per essere chiari, quello che voglio fare è:
"Javascript file" -> - magia -> - DOM, (already built with html file) and changed now with passed javascript file

risposta

2

scusato per la formattazione. Ho distanziato il più possibile, ma al mio screen reader non piacciono i controlli di formattazione di SO.

Ho intenzione di rispondere alla tua domanda, anche se sembra un po 'vaga. Per favore fatemi sapere se ho bisogno di riscrivere questa risposta per adattarsi a una situazione diversa. Suppongo che tu stia cercando di ottenere un file HTML dal web ed esegui Javascript da questo file, per agire su detto documento. Sfortunatamente, nessuna delle librerie xml Python ha un vero supporto DOM, e la conformità del DOM W3C è inesistente in ogni pacchetto che ho trovato. Quello che puoi fare è usare il file dom PyV8 w3c.py come esempio di partenza e creare il tuo DOM completo. W3C Sample Dom Tuttavia, è necessario riscrivere questo modulo poiché non rispetta le virgolette o gli apostrofi. BeautifulSoup non è anche il parser più veloce. Consiglierei l'utilizzo di qualcosa come l'opzione parser di destinazione di lxml.etree. LXML Target Parser Cerca "L'interfaccia del parser del feed". Quindi, è possibile caricare un documento HTML/Script con LXML, analizzarlo come di seguito ed eseguire ciascuno degli script necessari sul DOM creato.

Trova un esempio parziale di seguito. (Si prega di notare che gli standard HTML sono massicci, sparsi, e soprattutto specifici per il browser, quindi la vostra milizia può variare).

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

Ma come ho capito, crea solo dom. Non posso alimentare il file javascript per eseguirlo su un dom pronto, posso? – Sergey

4

Un buon esempio per quello che stai cercando di fare può essere trovato qui:

https://github.com/buffer/thug

Si tratta di un client python http esecuzione JS via PyV8 per scopi di ricerca di sicurezza, ma può essere legato giù facilmente per esigenze più semplici.