日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python练习1-文档格式化成html

發布時間:2025/6/17 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python练习1-文档格式化成html 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文檔格式化成HTML

? ? 把文檔格式化成了THML,并沒有處理所有thml規則,只是處理了一部分,功能不重要,重要的是復習熟悉下Python對文檔的處理細節。畢竟Python大多數給我的印象都是處理文檔。代碼里有很多邏輯可能不嚴謹,這里再次強調只是為了復習字符串以及文檔操作。

? ? 同時提醒一下,如果運行失敗,請刪除注釋,我是用vs2015編寫的,返現當時中文注釋導致編碼錯誤運行失敗。一共四個文檔:


?入口文檔是markup.py

參數?python?markup.py?<?xxx.txt?>?xxx.html

執行效果和代碼如下:



Util.py

def lines(file):for line in file:yield lineyield '\n'def blocks(file):block = []for line in lines(file):if line.strip(): #'\n','\r','\t',' 'block.append(line);elif block:yield ''.join(block).strip()block = []
Handlers.py

class Handler:"""處理從Parser調用的方法的對象。這個解析器會在每個塊的開始部分調用start()和end()方法,使用合適的塊名作為參數,sub()方法會用于正則表達式替換中。當使用了'emphasis'這樣的名字調用時,它會返回合適的替換函數。"""def callback(self ,prefix ,name ,*args):method = getattr(self ,prefix + name ,None)if callable(method) : return method(*agrs)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: match.group(0)return resultreturn substitutionclass HTMLRenderer(Handler):"""用于生成HTML的具體處理程序THMLRenderer內容的方法都是可以通過超類處理程序的start()、end()和sub()方法來訪問。他們實現了用于HTRML文檔的基本標簽。"""def start_document(self):print('<html><head><title>...</title></head><body>')def end_document(self):print('</body></html>')def start_paragraph(self):print('<p>')def end_paragraph(self):print('</p>')def start_heading(self):print('<h2>')def end_heading(self):print('</h2>')def start_list(self):print('<ul>')def end_list(self):print('</ul>')def start_listitem(self):print('<li>')def end_listitem(self):print('</li>')def start_title(self):print('<title>')def end_title(self):print('</title>')def sub_emphasis(self ,match):return ('<em>%s</em>' % match.group(1))def sub_url(self ,match):return ('<a href = "%s">%s</a>' % (match.group(1),match.group(1)))def sub_mail(self ,match):return ('<a href="mailto:%s">%s</a>' % (match.group(1),match.group(1)))def feed(self ,data):print(data)

Rules.py

class Rule:"""所有規則的基類。"""def action(self ,block ,handler):handler.start(self.type)handler.feed(block)handler.end(self.type)return Trueclass HeadingRule(Rule):"""標題占一行,最多70個字符,并且不以冒號結尾。"""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 = 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

Markup.py

import 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(bolck ,handler):return re.sub(pattern ,handler.sub(name),bolck)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)

總結

以上是生活随笔為你收集整理的Python练习1-文档格式化成html的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 极品videosvideo喷水 | 亚洲成色网 | 久久精品aaaaaa毛片 | 欧美巨乳在线观看 | 日韩视频中文 | 黄色小毛片 | 国产哺乳奶水91在线播放 | 中文字幕在线观看第二页 | 99热这里只有精品7 青青草社区 | 日韩区欧美区 | 欧美激情一区二区三区蜜桃视频 | 亚洲一区二区三区在线观看视频 | 日韩h在线观看 | 久久久久成人精品无码中文字幕 | 国产三级av在线播放 | 精品国产视频在线 | 一区二区免费在线 | 成人春色影视 | 国产偷人爽久久久久久老妇app | 四虎影像 | 一区二区三区网站 | 久久国产精品影院 | a天堂在线观看视频 | 久草视频免费看 | 日韩中文字幕精品 | 欧美老司机 | 99re这里只有精品在线观看 | 操操操视频 | 国产一级不卡毛片 | 夜夜涩| 91精品区| 97精品超碰一区二区三区 | 在线观看国产欧美 | 特级精品毛片免费观看 | 自拍偷拍第八页 | 国内精品国产三级国产aⅴ久 | 最近的中文字幕 | 99热网 | 91亚州 | 日韩一级在线观看视频 | 国产嫩草影院久久久久 | 丁香av| 国产精品福利在线观看 | www.日韩| 一区二区在线免费观看 | 小视频在线 | 国产www视频 | 国模私拍xvideos私拍 | 成人涩涩视频 | 日韩黄色短视频 | 神秘电影永久入口 | 亚洲影院一区二区三区 | 视频免费观看在线 | 中文字幕日日夜夜 | 白嫩初高中害羞小美女 | 丝袜人妖 | 国产女人18毛片水真多 | 囯产精品久久久久久 | 后宫秀女调教(高h,np) | 国产精品高清网站 | 深爱开心激情 | 探花国产精品一区二区 | 91少妇丨porny丨 | 国产精品免费一区二区三区 | 就是喜欢被他干 | 欧美精品在线观看视频 | 午夜精 | 香蕉尹人网 | 伊人网视频 | 名人明星三级videos | 欧美日韩伊人 | 亚洲精品一区二区 | 日韩一级在线观看视频 | 久久精品香蕉 | 婷婷成人综合 | 懂色a v| 午夜看片在线 | 午夜精品福利视频 | 亚洲第一色| 亚洲午夜在线播放 | mm1313亚洲精品 | 少妇精品偷拍高潮白浆 | 成人av片在线观看 | 婷婷狠狠操 | 人妻av一区二区 | 在线观看av不卡 | 久久久久黄 | 日韩av高清无码 | 老司机精品在线 | 亚洲欧美国产视频 | 欧美九九九 | 秋霞成人午夜鲁丝一区二区三区 | 在线不卡欧美 | 一区二区不卡视频 | 操批网站 | 国产人成视频在线观看 | 国产一二区视频 | 久久久久亚洲 | 丁香花电影高清在线阅读免费 |