《python基础教程》书中的第四个练习,新闻聚合。现在很少见的一类应用,至少我从来没有用过,又叫做Usenet。这个程序的主要功能是用来从指定的来源(这里是Usenet新闻组)收集信息,然后讲这些信息保存到指定的目的文件中(这里使用了两种形式:纯文本和html文件)。这个程序的用处有些类似于现在的博客订阅工具或者叫RSS订阅器。
先上代码,然后再来逐一分析:
from nntplib import NNTP from time import strftime,time,localtime from email import message_from_string from urllib import urlopen import textwrap import re day = 24*60*60 def wrap(string,max=70): ''' ''' return '\n'.join(textwrap.wrap(string)) + '\n' 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 distribute(self): items = [] for source in self.sources: items.extend(source.getItems()) for dest in self.destinations: dest.receiveItems(items) class NewsItem: def __init__(self,title,body): self.title = title self.body = body class NNTPSource: def __init__(self,servername,group,window): self.servername = servername self.group = group self.window = window def getItems(self): start = localtime(time() - self.window*day) date = strftime('%y%m%d',start) hour = strftime('%H%M%S',start) server = NNTP(self.servername) ids = server.newnews(self.group,date,hour)[1] for id in ids: lines = server.article(id)[3] message = message_from_string('\n'.join(lines)) title = message['subject'] body = message.get_payload() if message.is_multipart(): body = body[0] yield NewsItem(title,body) server.quit() class SimpleWebSource: def __init__(self,url,titlePattern,bodyPattern): self.url = url self.titlePattern = re.compile(titlePattern) self.bodyPattern = re.compile(bodyPattern) def getItems(self): text = urlopen(self.url).read() titles = self.titlePattern.findall(text) bodies = self.bodyPattern.findall(text) for title.body in zip(titles,bodies): yield NewsItem(title,wrap(body)) class PlainDestination: def receiveItems(self,items): for item in items: print item.title print '-'*len(item.title) print item.body class HTMLDestination: def __init__(self,filename): self.filename = filename def receiveItems(self,items): out = open(self.filename,'w') print >> out,''' <html> <head> <title>Today's News</title> </head> <body> <h1>Today's News</hi> ''' print >> out, '<ul>' id = 0 for item in items: id += 1 print >> out, '<li><a href="#" rel="external nofollow" >%s</a></li>' % (id,item.title) print >> out, '</ul>' id = 0 for item in items: id += 1 print >> out, '<h2><a name="%i">%s</a></h2>' % (id,item.title) print >> out, '<pre>%s</pre>' % item.body print >> out, ''' </body> </html> ''' def runDefaultSetup(): agent = NewsAgent() bbc_url = 'http://news.bbc.co.uk/text_only.stm' bbc_title = r'(?s)a href="[^" rel="external nofollow" ]*">\s*<b>\s*(.*?)\s*</b>' bbc_body = r'(?s)</a>\s*<br/>\s*(.*?)\s*<' bbc = SimpleWebSource(bbc_url, bbc_title, bbc_body) agent.addSource(bbc) clpa_server = 'news2.neva.ru' clpa_group = 'alt.sex.telephone' clpa_window = 1 clpa = NNTPSource(clpa_server,clpa_group,clpa_window) agent.addSource(clpa) agent.addDestination(PlainDestination()) agent.addDestination(HTMLDestination('news.html')) agent.distribute() if __name__ == '__main__': runDefaultSetup()
这个程序,首先从整体上进行分析,重点部分在于NewsAgent,它的作用是存储新闻来源,存储目标地址,然后在分别调用来源服务器(NNTPSource以及SimpleWebSource)以及写新闻的类(PlainDestination和HTMLDestination)。所以从这里也看的出,NNTPSource是专门用来获取新闻服务器上的信息的,SimpleWebSource是获取一个url上的数据的。而PlainDestination和HTMLDestination的作用很明显,前者是用来输出获取到的内容到终端的,后者是写数据到html文件中的。
有了这些分析,然后在来看主程序中的内容,主程序就是来给NewsAgent添加信息源和输出目的地址的。
这确实是个简单的程序,不过这个程序可是用到了分层了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍python基础教程项目五之虚拟茶话会,包括了python基础教程项目五之虚拟茶话会的使用技巧和注意事项,需要的朋友参考一下 几乎在学习、使用任何一种编程语言的时候,关于socket的练习从来都不会少,尤其是会写一些局域网的通信的东西。所以书上的这个项目刚好可以练习一下socket编程。 这个练习的整体思路首先有一个聊天的服务器,这个服务器的功能主要是提供客户端socket的连接、存
本文向大家介绍python基础教程之Hello World!,包括了python基础教程之Hello World!的使用技巧和注意事项,需要的朋友参考一下 Python命令行 假设你已经安装好了Python, 那么在Linux命令行输入: 将直接进入python。然后在命令行提示符>>>后面输入: 可以看到,随后在屏幕上输出: print是一个常用函数,其功能就是输出括号中得字符串。 (在Pyth
本文向大家介绍Ruby on Rails基础之新建项目,包括了Ruby on Rails基础之新建项目的使用技巧和注意事项,需要的朋友参考一下 Ruby on Rails 目录结构 新建项目 gem源切换为 http://mirrors.aliyuncs.com/rubygems/ gem包即ruby包,使用Bundler工具,http://bundler.io/ 运行 访问localhost:3
本教程提供了 Python 程序员如何使用 gRPC 的指南。 通过学习教程中例子,你可以学会如何: 在一个 .proto 文件内定义服务。 用 protocol buffer 编译器生成服务器和客户端代码。 使用 gRPC 的 Python API 为你的服务实现一个简单的客户端和服务器。 假设你已经阅读了概览并且熟悉protocol buffers。 注意,教程中的例子使用的是 protoco
Python 3 基础教程
本文向大家介绍python基础教程之序列详解,包括了python基础教程之序列详解的使用技巧和注意事项,需要的朋友参考一下 sequence 序列 sequence(序列)是一组有顺序的元素的集合 (严格的说,是对象的集合,但鉴于我们还没有引入“对象”概念,暂时说元素) 序列可以包含一个或多个元素,也可以没有任何元素。 我们之前所说的基本数据类型,都可以作为序列的元素。元素还可以是另一个序列,以及