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")