Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Работаем с LXML




lxml это сторонняя библиотека с открытым кодом основанная на известном синтаксическом анализаторе libxml2. Библиотека обеспечивает стопроцентную совместимость с API ElementTree, полностью поддерживает XPath 1. 0 и имеет несколько других приятных фишек. Для Windows можно скачать инсталлятор; пользователям Linux следует проверить наличие скомпилированных пакетов в репозиториях дистрибутива (например, используя инструменты yum или apt-get). В противном случае придётся устанавливать lxml вручную.

> > > from lxml import etree              ① > > > tree = etree. parse('examples/feed. xml') ② > > > root = tree. getroot()               ③ > > > root. findall('{http: //www. w3. org/2005/Atom}entry') ④ [< Element {http: //www. w3. org/2005/Atom}entry at e2b4e0>, < Element {http: //www. w3. org/2005/Atom}entry at e2b510>, < Element {http: //www. w3. org/2005/Atom}entry at e2b540> ]

① При импорте lxml предоставляет абсолютно такой же API как встроенная библиотека ElementTree.

② Функция parse(): такая же как в ElementTree.

③ Метод getroot(): такой же.

④ Метод findall(): точно такой же.

При обработке больших XML документов lxml значительно быстрее чем встроенная библиотека ElementTree. Если Вы используете функции только из API ElementTree и хотите чтобы обработка выполнялась как можно быстрее, то можно попробовать импортировать библиотеку lxml и, в случае её отсутствия, использовать ElementTree.

try: from lxml import etreeexcept ImportError: import xml. etree. ElementTree as etree

Однако, lxml не только быстрее чем ElementTree: метод findall() поддерживает более сложные запросы.

> > > import lxml. etree                                                              ① > > > tree = lxml. etree. parse('examples/feed. xml')> > > tree. findall('//{http: //www. w3. org/2005/Atom}*[@href]')                        ② [< Element {http: //www. w3. org/2005/Atom}link at eeb8a0>, < Element {http: //www. w3. org/2005/Atom}link at eeb990>, < Element {http: //www. w3. org/2005/Atom}link at eeb960>, < Element {http: //www. w3. org/2005/Atom}link at eeb9c0> ]> > > tree. findall(" //{http: //www. w3. org/2005/Atom}*[@href='http: //diveintomark. org/']" ) ③ [< Element {http: //www. w3. org/2005/Atom}link at eeb930> ]> > > NS = '{http: //www. w3. org/2005/Atom}'> > > tree. findall('//{NS}author[{NS}uri]'. format(NS=NS))                            ④ [< Element {http: //www. w3. org/2005/Atom}author at eeba80>, < Element {http: //www. w3. org/2005/Atom}author at eebba0> ]

① В этом примере я импортирую объект lxml. etree (вместо объекта etree: from lxml import etree) чтобы подчеркнуть, что описываемые возможности реализуемы только с lxml.

② Этот запрос найдёт все элементы в пространстве имён Atom (любой вложенности), которые имеют атрибут href. Символы // в начале запроса обозначают «элементы любой вложенности, а не только потомки корневого элемента». {http: //www. w3. org/2005/Atom} обозначает «только элементы пространства имён Atom». Символ * значит «элементы с любым локальным именем». И [@href] обозначает «элемент имеет атрибут href».

③ В результате запроса найдены все элементы Atom с атрибутом href равным http: //diveintomark. org/.

④ После преобразования строки (иначе эти запросы становятся неимоверно длинны) данный запрос ищет элементы Atom author имеющие подэлементы Atom uri. Запрос возвращает только 2 элемента author: в первом и во втором элементах entry. В последнем элементе entry элемент author содержит только имя name, но не uri.

Вам мало? lxml имеет встроенную поддержку для выражений XPath 1. 0. Мы не будем детально рассматривать синтаксис XPath, так как это тема для отдельной книги. Однако мы рассмотрим пример использования XPath в lxml.

> > > import lxml. etree> > > tree = lxml. etree. parse('examples/feed. xml')> > > NSMAP = {'atom': 'http: //www. w3. org/2005/Atom'}               ① > > > entries = tree. xpath(" //atom: category[@term='accessibility']/.. ", ②... namespaces=NSMAP)> > > entries                                                       ③ [< Element {http: //www. w3. org/2005/Atom}entry at e2b630> ]> > > entry = entries[0]> > > entry. xpath('. /atom: title/text()', namespaces=NSMAP)          ④ ['Accessibility is a harsh mistress']

① Чтобы выполнить XPath запрос элементов из пространства имён, необходимо определить отображение префикса этого пространства. На самом деле это обычный словарь Python.

② А вот и XPath запрос. Данное выражение выполняет поиск элементов category (пространства имён Atom) содержащие атрибут с парой имя-значение term='accessibility'. Но это не совсем то, что возвращает запрос. Вы заметили символы /.. в конце строки запроса? Это обозначает «верни не найденный элемент, а его родителя». И так, одним запросом мы найдём все элементы entry с дочерними элементами < category term='accessibility'>.

③ Функция xpath() возвращает список объектов ElementTree. В анализируемом документе всего один элемент entry с атрибутом term='accessibility'.

④ Выражение XPath не всегда возвращает список элементов. Формально, DOM разобранного документа XML не содержит элементов, она содержит узлы (nodes). В зависимости от их типа узлы могут быть элементами, атрибутами или даже текстом. Результатом запроса XPath всегда является список узлов. Этот запрос возвращает список текстовых узлов: текст text() элемента title (atom: title) есть подэлемент текущего элемента (. /).

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...