Недавно зарелизил Leaf, это небольшая библиотека для парсинга HTML на Python.
Она уже довольно долгое время покрывает все мои нужды в парсинге, но еще есть идеи для развития.
Эта библиотека по сути обертка над lxml, которая делает работу с ней гораздо приятней.
Чтобы распарсить html, нужно передать строку с ним в leaf.parse:
Кроме того, теперь доступ к атрибутам элемента теперь более удобный:
Все стандартные методы lxml доступны (и элементы полученные в результате их выполнения сохраняют все преимущества библиотеки):
Ну и пожалуй самая интересная функциональность это конвертация html в bbcode и другие языки разметки. В будущем будут добавленны методы для конвертации в популярные языки разметки, а пока можно очень просто написать функцию для нужного метода.
Данная функция будет вызванна рекурсивно, принимая в качестве параметров element (это элемент html тега) и children (результат выполнения данной функции на всех детях данного элемента).
Чтобы сконвертировать элемент (к слову, можно использовать как отдельный слой, так и все дерево):
где document — это объект класса leaf.Parser.
Ну, и пара функций для работы с текстом:
to_unicode — Переводит строку в юникод
strip_accents — Убирает из строки ударения, умляуты и подобные вещи
strip_symbols — Убирает из строки разные юникодные спец. символы и прочее
strip_spaces — Удаляет лишние пробелы
strip_linebreaks — Удаляет лишние переводы строк
Более подробные примеры есть в тестах.
Библиотека доступна на:
Она уже довольно долгое время покрывает все мои нужды в парсинге, но еще есть идеи для развития.
Эта библиотека по сути обертка над lxml, которая делает работу с ней гораздо приятней.
Функции
- Удобный доступ к CSS селекторам как в jQuery
- Простой доступ к атрибутам элемента
- Возможность конвертации HTML в другие языки разметки (bbcode, markdown и т.д.)
- Несколько функций для работы с текстом
- Ну и конечно же все функции самой lxml
Описание
Чтобы распарсить html, нужно передать строку с ним в leaf.parse:
- import leaf
- document = leaf.parse(sample)
- links = document('div#menu a') # получаем ссылки из меню через CSS селекторы
- link = document.get('div#menu a') # получаем первую ссылку или None (если ссылок нет)
* This source code was highlighted with Source Code Highlighter.
Кроме того, теперь доступ к атрибутам элемента теперь более удобный:
- print link.onclick
- print link.id
* This source code was highlighted with Source Code Highlighter.
Все стандартные методы lxml доступны (и элементы полученные в результате их выполнения сохраняют все преимущества библиотеки):
- link = document.xpath('body/div/ul/li[@class="active_link"]')[0]
- link.get('a').text
* This source code was highlighted with Source Code Highlighter.
Ну и пожалуй самая интересная функциональность это конвертация 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
* This source code was highlighted with Source Code Highlighter.
Данная функция будет вызванна рекурсивно, принимая в качестве параметров element (это элемент html тега) и children (результат выполнения данной функции на всех детях данного элемента).
Чтобы сконвертировать элемент (к слову, можно использовать как отдельный слой, так и все дерево):
- document.parse(omgcode_formatter)
* This source code was highlighted with Source Code Highlighter.
где document — это объект класса leaf.Parser.
Ну, и пара функций для работы с текстом:
to_unicode — Переводит строку в юникод
strip_accents — Убирает из строки ударения, умляуты и подобные вещи
strip_symbols — Убирает из строки разные юникодные спец. символы и прочее
strip_spaces — Удаляет лишние пробелы
strip_linebreaks — Удаляет лишние переводы строк
Более подробные примеры есть в тестах.
Заключение
Библиотека доступна на: