Простая библиотека для парсинга HTML

originally posted at http://habrahabr.ru/blogs/python/115135/ by penpen 09.03.2011

Недавно зарелизил Leaf, это небольшая библиотека для парсинга HTML на Python. Она уже довольно долгое время покрывает все мои нужды в парсинге, но еще есть идеи для развития. Эта библиотека по сути обертка над lxml, которая делает работу с ней гораздо приятней.

Функции

Описание

Чтобы распарсить html, нужно передать строку с ним в leaf.parse:

import leaf  
document = leaf.parse(sample)
links = document('div#menu a') # получаем ссылки из меню через CSS селекторы
link = document.get('div#menu a') # получаем первую ссылку или None (если ссылок нет)

Все стандартные методы lxml доступны (и элементы полученные в результате их выполнения сохраняют все преимущества библиотеки):

print link.onclick
rint link.id

Ну и пожалуй самая интересная функциональность это конвертация html в bbcode и другие языки разметки. В будущем будут добавленны методы для конвертации в популярные языки разметки, а пока можно очень просто написать функцию для нужного метода.

# Пример функции конвертора из html в некий
# язык разметки, который поддерживает только
# ссылки заключенные в [url][/url]
def omgcode_formatter(element, children):
# Заменяем <br> на символ перевода строки
if element.tag == 'br':
    return '\n'
# Засовываем ссылки в [url][/url]
if element.tag == 'a':
    return u"[url=link}]{text}[/url]".format(link=element.href, text=children)
# Для всех остальных элементов возвращаем результат
# обработки всех детей.
if children:
    return children

Данная функция будет вызванна рекурсивно, принимая в качестве параметров element (это элемент html тега) и children (результат выполнения данной функции на всех детях данного элемента). Чтобы сконвертировать элемент (к слову, можно использовать как отдельный слой, так и все дерево):

document.parse(omgcode_formatter)

где document — это объект класса leaf.Parser.

Ну, и пара функций для работы с текстом:

Более подробные примеры есть в тестах.

Заключение

Библиотека доступна на: