Pull to refresh

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

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

Функции


  • Удобный доступ к CSS селекторам как в jQuery
  • Простой доступ к атрибутам элемента
  • Возможность конвертации HTML в другие языки разметки (bbcode, markdown и т.д.)
  • Несколько функций для работы с текстом
  • Ну и конечно же все функции самой lxml

Описание


Чтобы распарсить html, нужно передать строку с ним в leaf.parse:
  1. import leaf  
  2. document = leaf.parse(sample)
  3. links = document('div#menu a') # получаем ссылки из меню через CSS селекторы
  4. link = document.get('div#menu a') # получаем первую ссылку или None (если ссылок нет)
* This source code was highlighted with Source Code Highlighter.

Кроме того, теперь доступ к атрибутам элемента теперь более удобный:
  1. print link.onclick
  2. print link.id
* This source code was highlighted with Source Code Highlighter.

Все стандартные методы lxml доступны (и элементы полученные в результате их выполнения сохраняют все преимущества библиотеки):
  1. link = document.xpath('body/div/ul/li[@class="active_link"]')[0]
  2. link.get('a').text
* This source code was highlighted with Source Code Highlighter.

Ну и пожалуй самая интересная функциональность это конвертация html в bbcode и другие языки разметки. В будущем будут добавленны методы для конвертации в популярные языки разметки, а пока можно очень просто написать функцию для нужного метода.
  1.   # Пример функции конвертора из html в некий
  2.     # язык разметки, который поддерживает только
  3.     # ссылки заключенные в [url][/url]
  4.   def omgcode_formatter(element, children):
  5.     # Заменяем <br> на символ перевода строки
  6.     if element.tag == 'br':
  7.       return '\n'
  8.     # Засовываем ссылки в [url][/url]
  9.     if element.tag == 'a':
  10.       return u"[url=link}]{text}[/url]".format(link=element.href, text=children)
  11.     # Для всех остальных элементов возвращаем результат
  12.         # обработки всех детей.
  13.     if children:
  14.       return children
* This source code was highlighted with Source Code Highlighter.

Данная функция будет вызванна рекурсивно, принимая в качестве параметров element (это элемент html тега) и children (результат выполнения данной функции на всех детях данного элемента).
Чтобы сконвертировать элемент (к слову, можно использовать как отдельный слой, так и все дерево):
  1. 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 — Удаляет лишние переводы строк

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

Заключение


Библиотека доступна на:
Tags:
Hubs:
+49
Comments 27
Comments Comments 27

Articles