Сохранение объекта 'lxml.etree._ElementTree'

Я провел последние пару дней, чтобы справиться с основами lxml; в частности, используя lxml.html для анализа веб-сайтов и создания ElementTree содержимого. В идеале я хочу сохранить возвращенный ElementTree, чтобы я мог загрузить его и экспериментировать с ним, без необходимости анализировать веб-сайт каждый раз, когда я изменяю свой script. Я предположил, что маринование станет способом, но теперь я начинаю удивляться. Хотя я могу получить объект ElementTree после травления...

type(myObject) 

возвращает

<class 'lxml.etree._ElementTree'>

сам объект представляется "пустым", так как ни один из последующих вызовов метода/атрибутов, которые я делаю на нем, не дает никакого вывода.

Я предполагаю, что травление здесь не подходит, но может ли кто-нибудь предложить альтернативу?

(В случае, если это имеет значение, это происходит в: python3.2, lxml 2.3.2, snow-leopard))

Ответ 1

Вы уже имеете дело с XML, а lxml отлично разбирается в XML. Я так думаю проще всего было бы сериализовать XML:

Чтобы записать в файл:

import lxml.etree as ET

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

Чтобы вызвать метод write, обратите внимание, что myobject должен быть lxml.etree._ElementTree. Если это lxml.etree._Element, тогда вам понадобится myobject.getroottree().write(filename).

Чтобы проанализировать имя файла/путь, файл-объект или URL-адрес:

myobject = ET.parse(file_or_url)

Разбор строки:

myobject = ET.fromstring(content)

Ответ 2

lxml - это библиотека C - libxml, чтобы быть точным - и объект, вероятно, не поддерживает трассировку питона или любую другую сериализацию - кроме сериализации их в XML.

Поэтому вам придется либо хранить их в памяти, либо повторно анализировать фрагменты XML, которые вам нужны, я полагаю.

Ответ 3

Я не верю, что вы можете разборки экземпляров lxml, но то, что я сделал, потому что я был в подобной ситуации, я забрал экземпляры объектов, которые будут строить дерево.

У каждого экземпляра и его дочернего элемента была функция для построения дерева элементов. Поэтому я просто собирал/кешировал объект Python, извлекал его из кеша, а затем вызывал функции сборки для получения моего дерева элементов.