当前位置:首页 > CN2资讯 > 正文内容

python 解析 markdown 标题 python markdown解析器

2天前CN2资讯

Mistune——更快的markdown解析器

在Python中有很多markdown解析器,以前我一直使用的是Python-markdown,一个纯Python实现的markdown解析器,别的不说,慢的要死倒是真的。每次点击保存后,都要响应很久,我开始一直以为是我的vps在国外导致的,后来还用了Mistune才知道,不是网速的问题,是解析器的速度问题。

没有对比就没有伤害,Mistune是所有纯Python实现中最快的一个。在纯Python环境中,几乎比Python- markdown快4倍,在Cython的帮助下,几乎快5倍。现在我使用了CPython,几乎是点击完保存的一瞬间,就解析完了,可以说感觉是很明显的。

基础用法

一个简单的栗子:

import mistune mistune.markdown('I am using **mistune markdown parser**') # output: <p>I am using <strong>mistune markdown parser</strong></p>

如果关心性能,官方推荐使用对象实例化后在进行调用

import mistune markdown = mistune.Markdown() markdown('I am using **mistune markdown parser**')

选择项

在使用mistune.Renderer的时候会有一些选择项提供修改

renderer = mistune.Renderer(escape=True, hard_wrap=True) # use this renderer instance markdown = mistune.Markdown(renderer=renderer) markdown(text)
  • escape: 如果设置为False,则不会转义所有原始html标记。
  • hard_wrap: 如果设置为True,它将具有GFM换行功能。所有新行都将替换为<br>标记。GFM跟标准MD一样,行尾不允许直接回车换行,必须是\n\n或者空格空格\n
  • use_xhtml: 如果设置为True,则所有标记都将使用xhtml,例如:<hr />。
  • parse_block_html:只解析block级别的。
  • parse_inline_html: 只解析inline级别的。

Renderer(渲染器)

官方提供了渲染器,当然你也可以继承官方的Renderer然后自己重写或者添加一些方法,这里给了一个官网给出的栗子,是一个给所有代码块添加highlighting标签的栗子。

import mistune from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import html class HighlightRenderer(mistune.Renderer): def block_code(self, code, lang): if not lang: return '\n<pre><code>%s</code></pre>\n' % \ mistune.escape(code) lexer = get_lexer_by_name(lang, stripall=True) formatter = html.HtmlFormatter() return highlight(code, lexer, formatter) renderer = HighlightRenderer() markdown = mistune.Markdown(renderer=renderer) print(markdown('```python\nassert 1 == 1\n```'))

下面是关于解析内容的很关键的定义,一个是块级解析(Block Level),一个是小跨度级解析(Span Level),也就是每句话中间出现的那种markdown解析,加粗什么的,还有一个是脚注(Footnotes)

Block Level

块级的API如下:

block_code(code, language=None) #代码块 block_quote(text) #引用块 block_html(html) #原生html? header(text, level, raw=None) # 不知道是啥 hrule() # 不知道是啥 list(body, ordered=True) # 不知道是啥 list_item(text) # 不知道是啥 paragraph(text) # 段落 table(header, body) # 表格 table_row(content) # 表格行 table_cell(content, **flags) # 表格单元

Span Level

块级的API如下:

autolink(link, is_email=False) #引用链接 codespan(text) #行级code double_emphasis(text) #加粗 emphasis(text) #斜体 image(src, title, alt_text) #图片 linebreak() #不知道 newline() #新的一行? link(link, title, content) #引用链接 strikethrough(text) #不知道 text(text) #普通文字 inline_html(text) #内嵌HTML

Footnotes

脚注的API如下:

footnote_ref(key, index) footnote_item(key, text) footnotes(text)

自定义规则

下面就是自定义规则了,我们大概了解了每个API,官方源码里面主要分了以下几个类

  • BlockGrammar:关于块级的语法正则定义
  • BlockLexer:块级词法分析器
  • InlineGrammar:关于行级的语法正则定义
  • InlineLexer:行级词法分析器
  • Markdown:Markdown解析
  • Renderer:解析器

在这里,我举一个真实的栗子来讲解,首先抛出问题

问题:我在使用mathtype的时候,书写公式,例如这个公式||x||_1= \sum_{i=0}^{n}|x_i|,这是L1范数的公式,现在解析肯定没有问题了,我已经修复了,但如果是以前,会由于||x||后面的字符_和sum后面的字符_,匹配到markdown中就是斜体的定义,那么我的公式就会变为

||x|| @1= \sum@ {i=0}^{n}|x_i|

这个样子。所以为了解决这个问题,我要重写有关于下划线_和乘号*的markdown语法。

解决办法:

首先定位一下,主要引起这个的有两个,一个是加粗,一个是斜体,所以我重写他们。

  • 定义自己的InlineLexer,继承InlineLexer;
  • 找到规则double_emphasis和emphasis,我将加粗改写为了只允许**框住,斜体改写为了@框住;
  • 加入到default_rules这个list里面;
  • 重写输出函数output_double_emphasis和output_emphasis。
  • class MyInlineLexer(InlineLexer): def enable_delete_em(self): self.rules.double_emphasis = re.compile( r'\*{2}([\s\S]+?)\*{2}(?!\*)' # **word** ) self.rules.emphasis = re.compile( r'\@((?:\*\*|[^\*])+?)\@(?!\*)' # @word@ ) self.default_rules.insert(3, 'double_emphasis') self.default_rules.insert(3, 'emphasis') def output_double_emphasis(self, m): text = m.group(1) return self.renderer.double_emphasis(text) def output_emphasis(self, m): text = m.group(1) return self.renderer.emphasis(text)

    然后在解析markdown的时候

    renderer = Renderer() inline = MyInlineLexer(renderer) inline.enable_delete_em() markdown = mistune.Markdown(renderer=renderer, inline=inline)
  • 实例化Renderer;
  • 实例化自己的词法分析器;
  • 调用enable_delete_em()重写对应的地方;
  • 最后,实例化markdown,传入对应的renderer与inline即可。

    • 你可能想看:

      扫描二维码推送至手机访问。

      版权声明:本文由皇冠云发布,如需转载请注明出处。

      本文链接:https://www.idchg.com/info/19606.html

      分享给朋友:

      “python 解析 markdown 标题 python markdown解析器” 的相关文章

      CN2 GIA VPS推荐:最佳虚拟专用服务器选择

      CN2 GIA VPS概述 在当今数字时代,寻找一个稳定且高效的虚拟专用服务器(VPS)成为很多企业和个人用户的需求。而CN2 GIA VPS凭借其卓越的性能和稳定的连接,受到了越来越多的关注。简单来说,CN2 GIA是一种中国电信提供的高质量网络传输线路,可以确保数据的快速和安全传输。 我曾尝试过...

      主机类型与高性能配置详解,选择最适合你的主机方案

      主机的定义与分类 什么是主机? 当我们谈论“主机”这个词时,通常指的是计算机系统,特别是在网络环境中提供服务或资源的设备。我个人觉得主机不仅仅是实体的机器,而是指在网络中扮演着重要角色的一种技术资源。它可以执行各种任务,从存储数据到托管网站,再到运行应用程序,主机的功能几乎无所不包。可以想象,主机就...

      泰国VPS市场分析:高效、可靠的云服务器选择

      泰国VPS市场概述 近年来,泰国的VPS市场迎来了快速的发展。作为东南亚的一个重要互联网和商业枢纽,泰国吸引了越来越多的国内外服务商。这一切的变化让我感受到了市场的活力,尤其是在曼谷,一个充满竞争和机会的城市。在这片土地上,VPS服务逐渐成为了企业和个人用户实现数字化转型的重要工具。 在研究泰国VP...

      选择最佳香港VPS大带宽服务的全面指南,助你无忧搭建在线业务

      在如今这个信息高速发展的时代,选择适合的VPS服务显得尤为重要。特别是香港VPS大带宽服务,以其独特的优势吸引了越来越多的用户。对于想要进行国际业务、网站托管或是搭建游戏服务器的用户来说,香港VPS大带宽服务绝对是个不错的选择。 香港VPS大带宽的优势显而易见。一个显著的特点是无需备案,这意味着用户...

      台湾 VPS 服务器:低延迟高安全的理想选择

      台湾VPS服务器概述 我们常常听到“VPS服务器”这个词,但是仔细了解后,你会发现台湾的VPS服务器在众多选择中脱颖而出。这种服务器是“虚拟专用服务器”的缩写,它能让用户在一台物理服务器上分配自己的虚拟空间。这种技术让企业和个人用户可以以较低的成本拥有独立的服务器环境,从而更好地管理他们的网络资源。...

      APT攻击解析:如何应对高级持续性威胁

      APT攻击,或称为高级持续性威胁,是一种复杂的网络攻击形式。这种攻击的发起者通常是具有高度组织性和专业性的攻击者,可能是国家支持的黑客组织,或者其他有目的的恶意实体。他们的目标不仅仅是短期内造成损害,而是着眼于更长远的战略性目标,比如窃取国家机密、企业的核心技术或其他商业秘密。这种攻击对目标组织的声...