利用mistune解析markdown
Fri, Nov 13, 2015最近新学Markdown和Python,一个用于写作,一个用于编程,都十分顺手,因此想学一下怎样用Python实现对Markdown语法的解析。在Github上搜索到一个项目:mistune。该项目使用纯Python实现了Markdown语法到HTML的解析,号称很快速,项目主页上有它与其他Python解析器的性能对比,我没有尝试,有兴趣的可以做些基准测试。本篇描述的是怎样利用mistune来实现对Markdown的解析,以下正是我学习和实践的过程。
第一步:初识
mistune项目文档对mistune的 特性 、 安装方法 、 基本用法 和 高级用法 等都有详细描述,在此不再赘述太多,使用前需要从主页下载mistune.py
文件,基本的使用方法如下:
#test.py
import mistune
mk = mistune.Markdown()
output = mk('I am using **mistune markdown parser**')
print(output)
#这段代码将会输出:<p>I am using <strong>mistune markdown parser</strong></p>
注意,test.py
文件需要和mistune.py
文件在同一个目录下,否则Python不能正常import mistune
。
第二步:根据源文件自动生成HTML文档
在理解了第一步基本的使用方法后,我考虑自己写一个脚本调用mistune
模块,并通过Python文件操作读取源文件(.md
文件),并自动生成HTML文档(preview.html
),于是写了第一个简短的脚本:
#md2html.py
import mistune
mk = mistune.Markdown()
with open('input.md','r') as f:
s = f.read()
html = mk(s)
with open('preview.html','w') as f:
f.write(html)
这样,只要md2html.py
和mistune.py
在同一目录下,该脚本就可以根据input.md
文件中Markdown语法书写的内容自动生成一个preview.html
文件,当然,前提是你在同一个目录下提前写好一个符合Markdown语法要求的input.md
文档。
可以看出,以上脚本尽管简单地实现了目的,但是问题多多,且使用上不灵活,总结有以下几个缺点:
- 只能在
input.md
文件里提前写好内容才能转成HTML文档,使用上不灵活; - 没有异常处理机制,脚本不健壮,假如没有提前创建
input.md
,将报错:FileNotFoundError
; - 缺少提示符,用户界面不友好;
- 不能自动调用浏览器预览生成的HTML文档,不直观。
第三步:改进
鉴于之前的脚本存在各种缺点,我对脚本进行了改进:
#python3 code
#md2html.py
import sys
import mistune
import webbrowser
#Count the number of command line parameters to find the path of md file
lenArgv = len(sys.argv)
if lenArgv == 1:
url = input('Please input the path of md file:>')
elif lenArgv == 2:
url = sys.argv[1]
else:
url = input('You can only input a single path:>')
mk = mistune.Markdown()
#Exception handling:Avoid FileNotFoundError
while True:
try:
with open(url,'r') as f:
s = f.read()
break
except FileNotFoundError:
url = input('Not Found,Input the path again:>')
html = mk(s)
with open('preview.html','w') as f:
f.write(html)
#End of run,open preview.html automatically by default browser
print('preview.html is generated successfully!')
webbrowser.open('preview.html')
input()
改进版脚本说明:
- 通过
import sys
实现了对命令行参数的判断,可以用python md2html.py <可缺省的源文件路径>
进行调用,也可以直接运行md2html.py
文件后输入源文件路径进行调用,比之前的程序更加灵活; - 通过异常处理程序判断用户输入的路径是否正确,避免了程序的崩溃,增强了健壮性;
- 每一步都引入了提示符,便于用户使用时的理解,界面更友好;
- 通过
import webbrowser
实现html文件生成后的自动预览,更加直观。
写在后面
本文旨在提供一种学习思路,只是个人的想法,如有不正确的地方,还希望多多留言指正!另外Python编码风格的问题和写作方法的问题也请一起斧正,谢谢!使用中发现mistune这个模块对Markdown语法的解析并不完美,具体解析以下Markdown语法的时候即可发现:
#test.md
* unordered list
1. ordered list
1. other