Недавно зарелизил 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.
Ну, и пара функций для работы с текстом:
Более подробные примеры есть в тестах.
Библиотека доступна на: