您当前的位置: 首页 >  Python

轻松学Python

暂无认证

  • 2浏览

    0关注

    317博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Python 文本解析器

轻松学Python 发布时间:2019-08-19 20:57:02 ,浏览量:2

一、项目介绍

本教程讲解一个使用 Python 来解析纯文本生成一个 HTML 页面的小程序。

二、相关技术

Python:一种面向对象、解释型计算机程序设计语言,用它可以做 Web 开发、图形处理、文本处理和数学处理等等。

HTML:超文本标记语言,主要用来实现网页。

三、项目截图

纯文本文件:

Welcome to ShiYanLou

解析后生成的 HTML 页面如下图

image.png

四、项目讲解 1. 文本块生成器

首先我们需要有一个文本块生成器把纯文本分成一个一个的文本块,以便接下来对每一个文本快进行解析,util.py 代码如下:

#!/usr/bin/python
# encoding: utf-8

def lines(file):
    """
    生成器,在文本最后加一空行
    """
    for line in file: yield line
    yield '\n'

def blocks(file):
    """
    生成器,生成单独的文本块
    """
    block = []
    for line in lines(file):
        if line.strip():
            block.append(line)
        elif block:
            yield ''.join(block).strip()
            block = []

2. 处理程序

通过文本生成器我们得到了一个一个的文本块,然后需要有处理程序对不同的文本块加相应的 HTML 标记,handlers.py 代码如下:

#!/usr/bin/python
# encoding: utf-8

class Handler:
    """
    处理程序父类
    """
    def callback(self, prefix, name, *args):
        method = getattr(self, prefix + name, None)
        if callable(method): return method(*args)

    def start(self, name):
        self.callback('start_', name)

    def end(self, name):
        self.callback('end_', name)

    def sub(self, name):
        def substitution(match):
            result = self.callback('sub_', name, match)
            if result is None: result = match.group(0)
            return result
        return substitution

class HTMLRenderer(Handler):
    """
    HTML 处理程序,给文本块加相应的 HTML 标记
    """
    def start_document(self):
        print 'ShiYanLou'

    def end_document(self):
        print ''

    def start_paragraph(self):
        print '

' def end_paragraph(self): print '

' def start_heading(self): print '' def end_heading(self): print '' def start_list(self): print '
    ' def end_list(self): print '
' def start_listitem(self): print '
  • ' def end_listitem(self): print '
  • ' def start_title(self): print '' def end_title(self): print '' def sub_emphasis(self, match): return '%s' % match.group(1) def sub_url(self, match): return '%s' % (match.group(1), match.group(1)) def sub_mail(self, match): return '%s' % (match.group(1), match.group(1)) def feed(self, data): print data
    3. 规则

    有了处理程序和文本块生成器,接下来就需要一定的规则来判断每个文本块交给处理程序将要加什么标记,rules.py 代码如下:

    #!/usr/bin/python
    # encoding: utf-8
    
    class Rule:
        """
        规则父类
        """
        def action(self, block, handler):
            """
            加标记
            """
            handler.start(self.type)
            handler.feed(block)
            handler.end(self.type)
            return True
    
    class HeadingRule(Rule):
        """
        一号标题规则
        """
        type = 'heading'
        def condition(self, block):
            """
            判断文本块是否符合规则
            """
            return not '\n' in block and len(block)  test.html
    
    
    五、小结

    在这个小程序中,我们使用了 Python 来解析纯文本文件并生成 HTML 文件,这个只是简单实现,通过这个案例大家可以动手试试解析 Markdown 文件。

    关注
    打赏
    1663832040
    查看更多评论
    立即登录/注册

    微信扫码登录

    0.0401s