LXML: Быстрая и гибкая обработка XML и HTML в Python

Для обработки XML и HTML можно использовать и BeautifulSoup, но эта библиотека использует слишком много памяти и не удовлетворяют требованиям по скорости для больших файлов. Библиотека LXMLочень быстро открывает и обрабатывает большие XML или HTML файлы, поэтому мы и будем рассматривать её в этой статье.

Установить её вы можете отсюда. Давайте рассмотрим работу библиотеки на примерах.

Начнем мы с XML. Во-первых давайте импортируем саму библиотека lxml и определим текст с xml разметкой.

~~~{.python} from lxml import html, etree

example_xml = «»»

TimmyRichReminderRemeber the concert tickets. EricJoshRide PlansMeet at the gas station on the corner of Diffley and 13 at 6:00pm.

«»»

Notes — заметки

from — от кого

to — кому

heading — заголовок

body — текст заметки


XML структура определяет две заметки: с сообщением и  дополнительной информацией. Давайте получим некоторые данные из этой структуры.
Используя метод `fromstring`, мы преобразуем xml данные в новый объект.
~~~{.python}
notes = etree.fromstring(example_xml)

А вот так можно пройтись по всем потомкам элемента notes:

~~~{.python} for note in notes.getchildren(): print note.tag

note

note


Выборка объекта `note` для дальнейшего просмотра:
~~~{.python}
note = notes.getchildren()[0]

Вывод данных для каждого потомка элемента notes:

~~~{.python} for field in note.iterchildren(): print ‘%s: %s’ % (field.tag, field.text)

to: Timmy

from: Rich

heading: Reminder

body: Remeber the concert tickets.


Найти дочерние элементы с тегом `to`:
~~~{.python}
for field in notes.findall('.//to'):
print 'Note to: %s' % field.text
# Note to: Timmy
# Note to: Eric

Теперь, когда мы получили данные из нашего XML, мы должны попробовать обработать HTML. Давайте определим пример строки для работы с HTML.

~~~{.python} example_html = «»»

«»»


Теперь мы создадим наш объект с помощью `document_fromstring`.
~~~{.python}
doc = html.document_fromstring(example_html)

И мы уже можем делать выборку данных. Мы можем использовать CSS селекторы для поиска элементов; Это мой любимый способ для поиска элементов в рамках html документа.

Найти заголовок с помощью CSS селекторов:

~~~{.python} title = doc.cssselect(‘head title’)[0] print title.text

Example HTML Title


Получите все элементы с классом `.item` в теге div с классом `.all_items`:
~~~{.python}
items = doc.cssselect('div.all_items .item')
for item in items:
print item.text.strip()
# This is the first paragrah.
# This is the second paragraph.

Это просто базовая демонстрация LXML, но даже по этим простым примерам мы видим, насколько легко использовать эту библиотеку. Существует много дополнительных функций, которые мы не рассмотрели в этой статье! Если вы хотите узнать больше, смотрите их в документации по LXML.