我需要将Markdown文本转换为纯文本格式,以在我的网站上显示摘要。我希望使用Python编写代码。
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字符的文本。
Markdown和beautifulsoup4模块可以帮助您完成所描述的操作。
将Markdown转换为HTML后,您可以使用HTML解析器来剥离纯文本。
您的代码可能类似于以下内容:
from bs4 import BeautifulSoup
from markdown import markdown
html = markdown(some_html_string)
text = ''.join(BeautifulSoup(html).findAll(text=True))
这与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
我删除了评论,因为我终于认为我看到了问题的关键:将你的Markdown文本转换为HTML并从文本中删除HTML可能更容易。 我不知道有什么有效地从文本中删除Markdown的方法,但有许多HTML转纯文本的解决方案。
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)
根据我的有限经验,这不一定是一个非常快速的解决方案,但您可以尝试使用NLTK中的MarkdownCorpusReader。它需要一个包含Markdown文件的目录和一个用于有效文件ID的正则表达式。
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)
不幸的是,Markdown 有各种变种,所以具体要看它来自哪里,一些格式元素可能仍然存在。我无法完全测试,因为没有示例数据可供使用。对于英文,您可能还需要一个 punkt detokenizer。对于这里使用的默认标记化方式,我并不熟悉,但我推测它是使用 nltk.tokenize.word_tokenize,该方法结合了 treebank tokenizer 和英语 punkt tokenizer。
我还要补充一点,nlkt 的 Markdown 解析器是基于 markdown-it-py 和 mdit-plain 构建的,所以这些模块内部应该也有工具可用于处理此类问题。
pandoc --to=plain
会保留一些格式(标题下划线),但不会太多。 - naught101