Сохранение объекта '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, извлекал его из кеша, а затем вызывал функции сборки для получения моего дерева элементов.