сохранение объекта 'lxml.etree._ElementTree' - PullRequest
12 голосов
/ 26 ноября 2011

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

type(myObject) 

возвращает

<class 'lxml.etree._ElementTree'>

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

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

(В случае, если это имеет значение, вышесказанное происходит в: python3.2, lxml 2.3.2, снежный барс))

Ответы [ 3 ]

19 голосов
/ 26 ноября 2011

Вы уже имеете дело с 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)
13 голосов
/ 26 ноября 2011

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

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

3 голосов
/ 26 ноября 2011

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

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

...