Анализ и перемещение элементов из файла Markdown

Привет, ребята, я хочу разобрать, а затем пересечь файл Markdown. Я ищу что-то вроде xml.etree.ElementTree, но для Markdown.

Один вариант - преобразовать в HTML, а затем использовать другую библиотеку для анализа HTML. Но я бы хотел избежать этого шага.

Спасибо.

Ответ 1

В качестве еще одного упомянутого комментария Python-Markdown имеет API расширений, и, случается, он использует xml.etree.ElementTree под капотом. Теоретически вы можете создать расширение, которое обращается к этому внутреннему объекту ElementTree и делать с ним то, что вам нужно. Однако, если вы используете необработанный HTML (включая объекты HTML) и/или расширение кода, вы получите неполный документ, так как есть несколько постпроцессоров, которые выполняются в сериализованной строке. Поэтому я бы не стал его повторять по назначению (полное раскрытие: я разработчик Python-Markdown).

Достаточно длинный список, если существуют реализации Markdown здесь. Из чистых реализаций Python в этом списке Mistune является единственным, о котором я знаю, который использует двухэтапный процесс (первый шаг возвращает дерево разбора, шаг два сериализуют дерево разбора - вам нужен только первый шаг). Я никогда не использовал Mistune лично и не могу говорить о его стабильности или точности, но он должен быть клон Python из очень хорошей библиотеки JavaScript Marked.

Если вы ищете вокруг, я считаю, что некоторые из реализаций C используют аналогичный шаблон. Некоторые из них могут даже иметь оболочку Python. Если нет, создавать обертку с ctypes не должно быть слишком сложно.

Если по какой-то причине вы хотите использовать реализацию, которая не дает вам полного дерева синтаксического анализа, я бы предложил разбор полученного HTML с помощью LXML ( Python-оболочка C lib) или html5lib (чистый python), оба из которых могут возвращать объект ElementTree и намного быстрее (особенно LXML) и более прощающие недействительного HTML (особенно html5lib, который больше похож на настоящие браузеры в реальном мире). Помните, что Markdown может содержать необработанный HTML-код, и большинство маркер-парсеров просто передают его, действительный-или-нет. Если вы затем попытаетесь проанализировать его с помощью синтаксического анализа на основе XML (например, в xml.etree) или строгого парсера HTML (например, html.parser в стандартной библиотеке), один недопустимый тег может привести к сбою анализатора HTML.

Ответ 2

Существуют модули разбора Markdown, но, в отличие от модулей обработки XML и HTML, они, как правило, внедряются в пакеты рендеринга Markdown, а не представлены для произвольной работы разбора Markdown.

Таким образом, одним из вариантов может быть просмотр процессоров Markdown в Python, из которых есть тонна, найдите парсер, который вам больше всего нравится, и принять это.

Однако в зависимости от того, что вы хотите выполнить, может быть проще найти модуль обработки Markdown, который уже расширяется, и построить расширение для обработки. Python-Markdown, например, полный механизм расширения.