2011-11-25 14 views
11

Ho passato gli ultimi due giorni a cogliere le nozioni di base di lxml; in particolare utilizzando lxml.html per analizzare i siti Web e creare un ElementTree del contenuto. Idealmente, voglio salvare l'ElementTree restituito in modo che possa caricarlo e sperimentarlo, senza dover analizzare il sito ogni volta che modifico il mio script. Supponevo che il decapaggio fosse la strada da percorrere, tuttavia ora sto cominciando a chiedermi. Anche se sono in grado di recuperare un oggetto ElementTree dopo il decapaggio ...salvataggio di un oggetto 'lxml.etree._ElementTree'

type(myObject) 

rendimenti

<class 'lxml.etree._ElementTree'> 

l'oggetto stesso sembra essere 'vuoto', dal momento che nessuno del metodo successiva/attributo chiama faccio su di esso produce qualsiasi output.

La mia ipotesi è che il decapaggio non sia appropriato qui, ma qualcuno può suggerire un'alternativa?

(Nel caso in cui le cose, quanto sopra sta accadendo in: python3.2, lxml 2.3.2, snow-Leopard))

risposta

18

Si sta già lavorando con XML e lxml è ottimo per l'analisi di XML. Quindi penso che la cosa più semplice da fare sarebbe quella di serializzare in XML:

Per scrivere su file:

import lxml.etree as ET 

filename = '/tmp/test.xml' 
myobject.write(filename) 

per chiamare il metodo write, notare che myobject deve essere un lxml.etree._ElementTree. Se è un lxml.etree._Element, allora è necessario myobject.getroottree().write(filename).

per analizzare dal nome del file/percorso, oggetto file o URL:

myobject = ET.parse(file_or_url) 

per analizzare da stringa:

myobject = ET.fromstring(content) 
+0

Grazie per la risposta. Sfortunatamente la mia comprensione di lxml, alberi di elementi e simili, è così schematica che in realtà non capisco i suggerimenti che hai fatto.Ho cercato duramente di sfogliare il manuale di lxml negli ultimi due giorni, ma non ho ottenuto nulla, quindi per il momento lascerò questo progetto. –

+1

Il metodo di scrittura suggerito mi ha generato un errore in python3, ma il passaggio da "w" a "wb" ha funzionato. – deinonychusaur

+0

@Tomalak: grazie mille per la correzione. – unutbu

3

Io non credo che si possa salamoia casi lxml, ma quello che ho fatto, perché Mi trovavo in una situazione simile in cui ho sottoposto a picking le istanze dell'oggetto che avrebbero costruito l'albero.

Ogni istanza e il relativo child avevano una funzione per creare l'albero Element. Quindi vorrei semplicemente mettere sottochiave/cache nell'oggetto Python, recuperarlo dalla cache e chiamare le funzioni di compilazione per ottenere il mio albero Element.

+0

Grazie Bartek. Come ho già detto nella mia risposta sopra, è diventato chiaro che non ho abbastanza informazioni sugli alberi degli elementi e su lxml per utilizzare la tua risposta, o le altre risposte pubblicate qui. Detto questo, ho almeno confermato i miei sospetti sul fatto che il decapaggio non sia utile in questo esempio. –

+0

@Bartek, puoi dare un po 'di codice, per favore? –

13

lxml è una libreria C - libxml per la precisione - e l'oggetto probabilmente non supporta il decapaggio di Python o qualsiasi altro tipo di serializzazione - tranne la serializzazione in XML.

Quindi dovresti tenerli in memoria, o ri-analizzare i frammenti XML di cui hai bisogno, suppongo.

+4

Confermare che 'pickle' restituisce 'TypeError: can not pickle _Element objects' ... che è il modo in cui ho trovato questa domanda. – jamesc

Problemi correlati