Python: как преобразовать форматированный текст в уценке в текст

Мне нужно преобразовать текст уценки в простой текстовый формат для отображения сводки на моем веб-сайте. Я хочу код в Python.

7 ответов

Решение

Этот модуль поможет сделать то, что вы описываете:

http://www.freewisdom.org/projects/python-markdown/Using_as_a_Module

После того, как вы преобразовали уценку в HTML, вы можете использовать анализатор HTML, чтобы вырезать простой текст.

Ваш код может выглядеть примерно так:

from BeautifulSoup import BeautifulSoup
from markdown import markdown

html = markdown(some_html_string)
text = ''.join(BeautifulSoup(html).findAll(text=True))

Несмотря на то, что это очень старый вопрос, я хотел бы предложить решение, которое я недавно нашел. Этот не использует BeautifulSoup и не имеет затрат на конвертацию в html и обратно.

Базовый класс модуля markdown Markdown имеет свойствоoutput_formats, которое не настраивается, но в других случаях может быть исправлено, как почти все в python. Это свойство является именем выходного формата, определяющим форматирование, для функции рендеринга. По умолчанию он имеет два формата вывода: "html" и "xhtml" соответственно. С небольшой помощью он может иметь функцию рендеринга в виде открытого текста, которую легко написать:

from markdown import Markdown
from io import StringIO


def unmark_element(element, stream=None):
    if stream is None:
        stream = StringIO()
    if element.text:
        stream.write(element.text)
    for sub in element:
        unmark_element(sub, stream)
    if element.tail:
        stream.write(element.tail)
    return stream.getvalue()


# patching Markdown
Markdown.output_formats["plain"] = unmark_element
__md = Markdown(output_format="plain")
__md.stripTopLevelTags = False


def unmark(text):
    return __md.convert(text)

Функция unmark принимает текст уценки в качестве ввода и возвращает все символы уценки, которые были удалены.

Это похоже на ответ Джейсона, но правильно обрабатывает комментарии.

import markdown # pip install markdown
from bs4 import BeautifulSoup # pip install beautifulsoup4

def md_to_text(md):
    html = markdown.markdown(md)
    soup = BeautifulSoup(html, features='html.parser')
    return soup.get_text()

def example():
    md = '**A** [B](http://example.com) <!-- C -->'
    text = md_to_text(md)
    print(text)
    # Output: A B

Как предположил Нил, парсер nltk основан наmarkdown-itиmdit-plain. Их довольно легко использовать напрямую (BeautifulSoup не нужен!).

      pip install markdown-it-py mdit_plain
      from markdown_it import MarkdownIt
from mdit_plain.renderer import RendererPlain

parser = MarkdownIt(renderer_cls=RendererPlain)

md_data = "# some markdown"
txt_data = parser.render(md_data)

Прокомментировал и удалил его, потому что, наконец, мне кажется, что я вижу здесь проблему: может быть проще преобразовать текст уценки в HTML и удалить HTML из текста. Я ничего не знаю, чтобы эффективно удалить разметку из текста, но есть много HTML-решений для простого текста.

По моему ограниченному опыту, это не обязательно очень быстрое решение, но вы можете попробовать MarkdownCorpusReader от NLTK. Для этого требуется каталог, полный файлов уценки, и регулярное выражение для действительных идентификаторов файлов.

      from nltk.corpus.reader.markdown import MarkdownCorpusReader
from nltk.tokenize.treebank import TreebankWordDetokenizer
# You might also need a punkt detokenizer for the English language.

filepath = './some/path/here' 
reader = MarkdownCorpusReader(filepath, r'[w\]*\.md')

def get_text(reader: MarkdownCorpusReader, fileid: str) -> str:
    tokens = reader.words(fileids=fileid)
    # You might also need a punkt detokenizer for the English language.
    return TreebankWordDetokenizer().detokenize(tokens)

К сожалению, существуют варианты уценки, поэтому в зависимости от того, откуда она взята, некоторые элементы форматирования все еще могут присутствовать. Я не могу полностью проверить это, потому что у меня нет примеров данных для работы. Вам также может понадобиться детокенизатор пунктов для английского языка. Я не очень хорошо знаком с используемой здесь токенизацией по умолчанию, но предполагаю, что это nltk.tokenize.word_tokenize, который использует комбинацию токенизатора древовидного банка + токенизатор punkt на английском языке.

Я добавлю, что программа чтения уценок nlkt построена на markdown-it-py и mdit-plain, поэтому, по-видимому, в этих модулях также существуют инструменты, которые помогут в этом.

Я пришел сюда, когда искал способ выполнить sc GitLab Releases через вызов API . Я надеюсь, что это соответствует варианту использования оригинального вопрошающего.

Я декодировал markdown в обычный текст (включая пробелы в виде \nд.), таким образом:

          with open("release_note.md", 'r') as file:
        release_note = file.read()
        description = bytes(release_note, 'utf-8')
    return description.decode("utf-8")
Другие вопросы по тегам