Python 文本解析器
一、实验介绍
1.1 实验内容
讲解一个使用 Python 来解析纯文本生成一个 HTML 页面的小程序。
将学习和实践以下知识点:
Python 基本语法
HTML 标记语言1.2 实验知识点
Python:一种面向对象、解释型计算机程序设计语言,用它可以做 Web 开发、图形处理、文本处理和数学处理等等。
HTML:超文本标记语言,主要用来实现网页。1.3 实验环境
Python 3.6.5
pychram1.4 实验结果
纯文本文件:
冰灯冰灯是流行于中国北方的一种民间艺术,也是冰雕艺术的一种形式。-1 简介
-2 起源
-3 发展及现状
-4 冰雕
-5 参见
解析后生成的 HTML 页面如下图
二、项目文件结构
本项目中将创建以下的代码文件,每个文件的作用简介如下:
util.py:实现文本块生成器把纯文本分成一个一个的文本块,以便接下来对每一个文本块进行解析
handlers.py:为文本块打上合适的 HTML 标记
rules.py:设计一定的规则来判断每个文本块交给处理程序将要加什么标记
markup.py:对整个文本进行解析的程序
三、实验步骤
一共有文本块生成器、处理程序、规则、解析和运行与测试五个步骤。
3.1 文本块生成器
首先我们需要有一个文本块生成器把纯文本分成一个一个的文本块,以便接下来对每一个文本块进行解析,util.py 代码如下:
#!/usr/bin/python
# encoding: utf-8def lines(file):"""生成器,在文本最后加一空行"""for line in file: yield lineyield '\n'def blocks(file):"""生成器,生成单独的文本块"""block = []for line in lines(file):if line.strip():block.append(line)elif block:yield ''.join(block).strip()block = []
strip() 函数可以去除一个字符串前后的空格以及换行符,如果在strip()函数添加不同的参数,如strip(“me”),则可以去除字符串前后的”me”字符。
s = ” This is me\n”
s = s.strip()
s
‘This is me’
s = s.strip(“me”)
s
‘This is ‘
yield()会返回一个生成器(generator)。如果对generator以及对 yiels 语句不太熟悉,建议先阅读yield解释(https://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html)。
3.2 处理程序
假设我们已经知道一个文本块是 title/paragraph/heading/list,我们通过 handlers.py 给他们打上合适的 HTML 标记。代码如下:
'''对整个文本进行解析的程序'''
#!/usr/bin/python
# encoding: utf-8import sys, re
from handlers import *
from util import *
from rules import *class Parser:"""解析器父类"""def __init__(self, handler):self.handler = handlerself.rules = []self.filters = []def addRule(self, rule):"""添加规则"""self.rules.append(rule)def addFilter(self, pattern, name):"""添加过滤器"""def filter(block, handler):return re.sub(pattern, handler.sub(name), block)self.filters.append(filter)def parse(self, file):"""解析"""self.handler.start('document')for block in blocks(file):for filter in self.filters:block = filter(block, self.handler)for rule in self.rules:if rule.condition(block):last = rule.action(block, self.handler)if last: breakself.handler.end('document')class BasicTextParser(Parser):"""纯文本解析器"""def __init__(self, handler):Parser.__init__(self, handler)self.addRule(ListRule())self.addRule(ListItemRule())self.addRule(TitleRule())self.addRule(HeadingRule())self.addRule(ParagraphRule())self.addFilter(r'\*(.+?)\*', 'emphasis')self.addFilter(r'(http://[\.a-zA-Z/]+)', 'url')self.addFilter(r'([\.a-zA-Z]+@[\.a-zA-Z]+[a-zA-Z]+)', 'mail')"""
运行程序
"""
handler = HTMLRenderer()
parser = BasicTextParser(handler)
parser.parse(sys.stdin)
在上面的代码中 callable() 函数能够检查一个函数是否能够被调用。如果能够被调用返回True。
gerattr()函数则是返回一个对象的属性值。举例来说,getattr(x, ‘foo’, None) 就相当于是 x.foo,而如果没有这个属性值foobar,则返回我们设定的默认值None。
3.3 规则
有了处理程序和文本块生成器,接下来就需要一定的规则来判断每个文本块交给处理程序将要加什么标记,rules.py 代码如下:
'''设计一定的规则来判断每个文本块交给处理程序将要加什么标记'''
#!/usr/bin/python
# encoding: utf-8class Rule:"""规则父类"""def action(self, block, handler):"""加标记"""handler.start(self.type)handler.feed(block)handler.end(self.type)return Trueclass HeadingRule(Rule):"""一号标题规则"""type = 'heading'def condition(self, block):"""判断文本块是否符合规则"""return not '\n' in block and len(block) <= 70 and not block[-1] == ':'class TitleRule(HeadingRule):"""二号标题规则"""type = 'title'first = Truedef condition(self, block):if not self.first: return Falseself.first = Falsereturn HeadingRule.condition(self, block)class ListItemRule(Rule):"""列表项规则"""type = 'listitem'def condition(self, block):return block[0] == '-'def action(self, block, handler):handler.start(self.type)handler.feed(block[1:].strip())handler.end(self.type)return Trueclass ListRule(ListItemRule):"""列表规则"""type = 'list'inside = Falsedef condition(self, block):return Truedef action(self, block, handler):if not self.inside and ListItemRule.condition(self, block):handler.start(self.type)self.inside = Trueelif self.inside and not ListItemRule.condition(self, block):handler.end(self.type)self.inside = Falsereturn Falseclass ParagraphRule(Rule):"""段落规则"""type = 'paragraph'def condition(self, block):return True
3.4 解析
当我们知道每一个文本块进行怎么样的处理,交给谁去处理之后,我们就可以对整个文本进行解析了,markup.py 代码如下:
'''对整个文本进行解析的程序'''
#!/usr/bin/python
# encoding: utf-8import sys, re
from handlers import *
from util import *
from rules import *class Parser:"""解析器父类"""def __init__(self, handler):self.handler = handlerself.rules = []self.filters = []def addRule(self, rule):"""添加规则"""self.rules.append(rule)def addFilter(self, pattern, name):"""添加过滤器"""def filter(block, handler):return re.sub(pattern, handler.sub(name), block)self.filters.append(filter)def parse(self, file):"""解析"""self.handler.start('document')for block in blocks(file):for filter in self.filters:block = filter(block, self.handler)for rule in self.rules:if rule.condition(block):last = rule.action(block, self.handler)if last: breakself.handler.end('document')class BasicTextParser(Parser):"""纯文本解析器"""def __init__(self, handler):Parser.__init__(self, handler)self.addRule(ListRule())self.addRule(ListItemRule())self.addRule(TitleRule())self.addRule(HeadingRule())self.addRule(ParagraphRule())self.addFilter(r'\*(.+?)\*', 'emphasis')self.addFilter(r'(http://[\.a-zA-Z/]+)', 'url')self.addFilter(r'([\.a-zA-Z]+@[\.a-zA-Z]+[a-zA-Z]+)', 'mail')"""
运行程序
"""
handler = HTMLRenderer()
parser = BasicTextParser(handler)
parser.parse(sys.stdin)
3.5 运行与测试
运行程序(纯文本文件为 test.txt,生成 HTML 文件为 test.html):
python markup.py < test.txt > test.html
获得 test.html 文件之后,我们想在浏览器中看一下我们的文本解释效果。
相关文件以及源码下载:https://download.csdn.net/download/jia666666/10586143
Python 文本解析器相关推荐
- Python 实现文本解析器
Python 实现文本解析器 一. 内容介绍 本节实验我们学习使用 Python 来解析纯文本文件,并生成 HTML 页面.本节实验只是一个简单实现,支持了较少部分的 Markdown 语法,但通过实 ...
- Python XML解析器– ElementTree
Python XML parser provides us an easy way to read the XML file and extract useful data. Today we wil ...
- 微信小程序商品详情html,微信小程序关于商品详情类的富文本解析器
微信小程序关于商品详情类的富文本解析器 2020年08月10日 | 萬仟网IT编程 | 我要评论 微信小程序关于商品详情类的富文本解析器富文本的解析,在vue中有v-html解析富文本的方法,但是在微 ...
- rust nom 一个文本解析器的使用
rust nom 一个文本解析器的使用 简述 版本 早期版本 新的改变 常用的几个解析器.组合器 后续 简述 nom, 是 一个Rust 的文本解析器库,它的运行消耗低.速度快,针对一些文本的解析非常 ...
- 在用pip安装python包时,出现/home/×××/anaconda3/bin/python没有解析器
如果直接将配置好的python环境移植到另外一台电脑,会出现下面错误: 在用pip安装python包时,出现/home/×××/bin/python没有解析器的问题 可尝试: gedit /home/ ...
- Python 歌词解析器 音乐与歌词同步播放
python 歌词解析器 前言 歌词解析器,顾名思义就是在播放歌曲的时候,音乐播放器放到那一句就显示对应的歌词. *在 python中歌词解析器并不难写,运用 time模块来编写歌词解析器, time ...
- Python语法解析器PLY——lex and yacc in Python - 娄振林专栏 - 博客频道 - CSDN.NET
Python语法解析器PLY--lex and yacc in Python - 娄振林专栏 - 博客频道 - CSDN.NET Python语法解析器PLY--lex and yacc in Pyt ...
- python简介pdf_PDFMiner首页、文档和下载 - Python PDF 解析器 - OSCHINA - 中文开源技术交流社区...
PDFMiner 是一个 Python 的 PDF 解析器,可以从 PDF 文档中提取信息.与其他 PDF 相关的工具不同,它侧重的是获取和分析文本数据.PDFMiner 允许获取某一页中文本的准确位 ...
- python 参数解析器_Python中最好用的命令行参数解析工具
接下来只剩下 argparse 这一神器,它几乎能满足我对命令解析器的所有需求.它支持解析一参数多值,可以自动生成help命令和帮助文档,支持子解析器,支持限制参数取值范围等等功能. 身为老司机,还是 ...
最新文章
- Linux安装—IP设置
- discuz!x3 门户友情链接模块的横排显示
- 网络营销外包——网络营销外包专员如何系统化梳理网站优化方法
- 强烈推荐的TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)
- u-boot 源码分析讲解
- 将 a.txt 文件中的单词与 b.txt 文件中的单词交替合并到 c.txt 文件 中
- LiveQing直播点播存储流媒体服务-服务器并发性能及消耗带宽计算参考
- LeetCode每日打卡 - 汉明距离总和
- python3学习笔记(2)_list-tuple
- 企业如何建设BI商业智能系统
- Redisson 布隆过滤器
- fiddler注释_FIDDLER的使用方法及技巧总结
- python源码中的学习笔记_第5章_字典
- 论如何高速下载磁力链接、电驴链接、种子文件里的资源
- R语言 循环 步长 写法
- ubuntu系统重装恢复步骤
- 快手的视频 发到抖音 怎么消重 视频md5值查询
- 目前缺少用于语义分割的 3D LiDAR 数据吗?关于三维点云数据集和方法的调查
- 压力测试、负载测试、渗透测试、容量测试、敏感度测试
- Xshell用Public Key登录华为网络设备(交换机等)