2011-11-25 8 views
11

He pasado los últimos días aprendiendo los principios básicos de lxml; en particular, utilizando lxml.html para analizar sitios web y crear un ElementTree del contenido. Idealmente, quiero guardar el ElementTree devuelto para que pueda cargarlo y experimentar con él, sin tener que analizar el sitio web cada vez que modifico mi script. Supuse que el decapado sería el camino a seguir, sin embargo, ahora estoy empezando a preguntarme. A pesar de que soy capaz de recuperar un objeto elementtree después del decapado ...guardando un objeto 'lxml.etree._ElementTree'

type(myObject) 

vuelve

<class 'lxml.etree._ElementTree'> 

el objeto en sí parece ser 'vacío', ya que ninguno del método posterior/atributo llama hago en ella produce cualquier salida.

Supongo que el decapado no es apropiado aquí, pero ¿alguien puede sugerir una alternativa?

(En caso de que las cosas, lo anterior está ocurriendo en: python3.2, lxml 2.3.2, nieve-leopardo))

Respuesta

18

Ya está trabajando con XML, y lxml es excelente para analizar XML. Así que creo que la cosa más sencilla de hacerlo sería para serializar a XML:

escribir en el archivo:

import lxml.etree as ET 

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

para llamar al método write, tenga en cuenta que debe haber un myobjectlxml.etree._ElementTree. Si es un lxml.etree._Element, entonces necesitaría myobject.getroottree().write(filename).

para analizar de nombre de archivo/ruta, objeto de archivo, o URL:

myobject = ET.parse(file_or_url) 

para analizar de cadena:

myobject = ET.fromstring(content) 
+0

Gracias por la respuesta. Desafortunadamente, mi comprensión de lxml, árboles de elementos y similares es tan incompleta que no entiendo las sugerencias que usted ha hecho.Intenté recorrer el manual de lxml durante los últimos días pero no he llegado a ninguna parte, así que voy a dejar este proyecto por el momento. –

+1

El método de escritura sugerido me dio un error en python3, pero cambiar de 'w' a 'wb' lo hizo funcionar. – deinonychusaur

+0

@Tomalak: Muchas gracias por la corrección. – unutbu

3

No creo que se puede conservar en vinagre casos LXML, pero lo que hice porque Estaba en una situación similar si seleccioné las instancias del objeto que construirían el árbol.

Cada instancia y su hijo tenían una función para construir el árbol de elementos. Así que simplemente recortaría/almacenaría en caché el objeto de Python, lo buscaría desde el caché y luego llamaría a las funciones de compilación para obtener mi árbol de elementos.

+0

Gracias Bartek. Como mencioné en mi respuesta anterior, está claro que realmente no tengo suficiente con los árboles de elementos y con lxml para hacer uso de su respuesta, o de las otras respuestas publicadas aquí. Dicho esto, al menos he confirmado mis sospechas de que el decapado no es útil en este ejemplo. –

+0

@Bartek, ¿puedes darnos algún código, por favor? –

13

lxml es una biblioteca de C, libxml para ser precisos, y el objeto probablemente no es compatible con el decapado de Python ni con ningún otro tipo de serialización, excepto la serialización en XML.

Así que tendrá que guardarlos en la memoria o volver a analizar los fragmentos XML que necesita, supongo.

+4

Confirmando que 'pickle' devuelve 'TypeError: no puede saltear _Element objects' ... que es como encontré esta pregunta. – jamesc

Cuestiones relacionadas