Pull to refresh

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

Reading time2 min
Views9.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
Comments27

Articles