Для обработки XML и HTML можно использовать и BeautifulSoup, но эта библиотека использует слишком много памяти и не удовлетворяют требованиям по скорости для больших файлов. Библиотека LXMLочень быстро открывает и обрабатывает большие XML или HTML файлы, поэтому мы и будем рассматривать её в этой статье.
Установить её вы можете отсюда. Давайте рассмотрим работу библиотеки на примерах.
Начнем мы с XML. Во-первых давайте импортируем саму библиотека lxml и определим текст с xml разметкой.
~~~{.python} from lxml import html, etree
example_xml = «»»
«»»
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.