前言
Python 是一种极具可读性和通用性的编程语言。它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣。Python 易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择。
Python 是一种多范式语言,支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的。随着越来越多地在工业中被使用,Python 为那些寻求额外编程语言的人提供了巨大的潜力。
本文介绍了四个 Python 实战项目,涵盖即时标记解析器、PDF 绘图生成、XML 网站自动生成以及新闻聚合工具。通过解析 handlers、filters、rules 等模块设计,学习 HTML 标记处理;利用 reportlab 库实现 PDF 绘制;基于 SAX 模式解析 XML 构建网站结构;设计 NewsAgent 架构完成新闻采集与分发。这些项目帮助开发者掌握面向对象编程、模块化设计及标准库应用,适合进阶练习。

Python 是一种极具可读性和通用性的编程语言。它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣。Python 易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择。
Python 是一种多范式语言,支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的。随着越来越多地在工业中被使用,Python 为那些寻求额外编程语言的人提供了巨大的潜力。
当一个被称为 comp.lang.python 的 Python 新闻组在 1994 年形成时,Python 的用户基础不断增长,这为 Python 成为开源开发中最受欢迎的编程语言之一铺平了道路。
接下来,介绍四个经典的 Python 练手实战项目,帮助你深入理解 Python 的核心语法与架构设计。
这是《Python 基础教程》中的实践项目,旨在熟悉 Python 的代码方式及基本与非基本语法。重构后的程序分为四个模块:处理程序模块、过滤器模块、规则模块、语法分析器。
这个模块的作用是提供固定的 HTML 标记的输出(每一个标记都有 start 和 end),并对标记输出的开始和结束提供一个友好的访问接口。
class Handler:
def __init__(self):
self.filters = []
def addFilter(self, f):
self.filters.append(f)
def handle(self, data):
result = ''
for filter in self.filters:
result = filter.handle(result + data)
return result
这个模块更为简单,其实就是一个正则表达式的字符串。常见的过滤器包括强调牌过滤器、URL 牌过滤器、Email 牌过滤器。
class Filter(Handler):
def __init__(self, pattern, handler):
Handler.__init__(self)
self.pattern = pattern
self.handler = handler
def handle(self, data):
import re
result = ''
lastEnd = 0
for match in re.finditer(self.pattern, data):
result += data[lastEnd:match.start()]
result += self.handler.handle(match.group())
lastEnd = match.end()
result += data[lastEnd:]
return result
这个模块抛开那祖父类不说,其他类应该有的两个方法是 condition 和 action。前者是用来判断读进来的字符串是不是符合自家规则,后者是用来执行操作的。
class Rule(Handler):
def __init__(self, condition, action):
self.condition = condition
self.action = action
def test(self, data):
return bool(self.condition(data))
def handle(self, data):
if self.test(data):
return self.action(data)
else:
return data
这个模块的作用其实就是协调读入的文本和其他模块的关系。它提供了两个存放'规则'和'过滤器'的列表,使得整个程序的灵活性得到了极大的提高。
class Parser(Handler):
def __init__(self, handler):
Handler.__init__(self)
self.handler = handler
def feed(self, data):
list = []
for rule in self.rules:
for part in rule.split():
list.append(part)
# 遍历客户端给插进去的所有规则和过滤器,来处理读进来的文本
for item in list:
if item.startswith('rule'):
pass
elif item.startswith('filter'):
pass
self.handler.handle(data)
项目用途:
这是《Python 基础教程》中的第二个项目,关于 Python 操作 PDF。涉及到的知识点包括 urllib 的使用和 reportlab 库的使用。
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
def draw_pdf(filename):
c = canvas.Canvas(filename, pagesize=letter)
width, height = letter
# 绘制文字
c.drawString(100, height - 100, "Hello, Python PDF!")
# 绘制图形
c.rect(100, 50, 200, 100)
c.save()
if __name__ == '__main__':
draw_pdf('output.pdf')
这个项目根据一份 XML 文件,生成对应目录结构的网站。既然是通过 XML 结构生成网站,那所有的事情都应该由这个 XML 文件来控制。
<website>
<directory name="public_html">
<page title="Home" file="index.html">
<h1>Welcome</h1>
</page>
</directory>
</website>
在 Python 中使用 SAX 方式处理 XML 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。
import xml.sax
class WebsiteHandler(xml.sax.ContentHandler):
def __init__(self):
self.current_dir = None
self.current_page = None
def startElement(self, name, attrs):
if name == 'directory':
self.current_dir = attrs.get('name')
# 创建文件夹逻辑
elif name == 'page':
self.current_page = attrs.get('file')
# 创建页面逻辑
def endElement(self, name):
if name == 'directory':
self.current_dir = None
elif name == 'page':
self.current_page = None
def characters(self, content):
# 处理标签内部的所有字符串
pass
# 解析调用
handler = WebsiteHandler()
xml.sax.parse('website.xml', handler)
主要掌握的内容是 Python 中使用 SAX 处理 XML,以及 Python 中的函数使用,比如 getattr,传参数时的星号等。
书中的第四个练习,新闻聚合。这个程序的主要功能是用来从指定的来源收集信息,然后将这些信息保存到指定的目的文件中。
class NewsAgent:
def __init__(self):
self.sources = []
self.destinations = []
def addSource(self, source):
self.sources.append(source)
def addDestination(self, dest):
self.destinations.append(dest)
def run(self):
for source in self.sources:
data = source.fetch()
for dest in self.destinations:
dest.write(data)
class NNTPSource:
def fetch(self):
# 连接新闻服务器获取信息
return "News Data"
class HTMLDestination:
def write(self, data):
with open('news.html', 'w') as f:
f.write(data)
if __name__ == '__main__':
agent = NewsAgent()
agent.addSource(NNTPSource())
agent.addDestination(HTMLDestination())
agent.run()
这四个项目涵盖了文本处理、文件操作、XML 解析和网络通信等 Python 核心应用场景。通过动手实现这些项目,可以深入理解面向对象编程、模块化设计以及标准库的使用。建议读者在阅读完理论后,亲自敲一遍代码,并尝试修改其中的功能以加深理解。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online