41

我需要将 markdown 文本转换为纯文本格式以在我的网站中显示摘要。我想要python中的代码。

4

5 回答 5

47

MarkdownBeautifulSoup (现在称为beautifulsoup4)模块将帮助您完成您所描述的工作。

将 markdown 转换为 HTML 后,可以使用 HTML 解析器去除纯文本。

您的代码可能如下所示:

from bs4 import BeautifulSoup
from markdown import markdown

html = markdown(some_html_string)
text = ''.join(BeautifulSoup(html).findAll(text=True))
于 2009-04-17T19:27:32.137 回答
46

尽管这是一个非常古老的问题,但我想提出一个我最近提出的解决方案。这个既不使用 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函数将 markdown 文本作为输入,并返回所有删除的 markdown 字符。

于 2019-02-28T10:44:42.587 回答
3

这类似于 Jason 的回答,但可以正确处理评论。

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
于 2020-10-28T14:43:21.183 回答
2

评论并删除它,因为我终于认为我在这里看到了问题:将您的降价文本转换为 HTML 并从文本中删除 HTML 可能更容易。我不知道有什么可以有效地从文本中删除降价,但是有很多 HTML 到纯文本的解决方案。

于 2009-04-17T19:42:56.950 回答
-2

我在寻找通过API 调用执行 sc GitLab Releases的方法时来到这里。我希望这与原始提问者的用例相匹配。

我以这种方式将降价解码为纯文本(包括\n等形式的空格):

    with open("release_note.md", 'r') as file:
        release_note = file.read()
        description = bytes(release_note, 'utf-8')
    return description.decode("utf-8")
于 2021-11-26T09:53:41.440 回答