PHP前端开发

python基础教程项目四之新闻聚合

百变鹏仔 3小时前 #Python
文章标签 基础教程

这篇文章主要为大家详细介绍了python基础教程项目四之新闻聚合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

《python基础教程》书中的第四个练习,新闻聚合。现在很少见的一类应用,至少我从来没有用过,又叫做Usenet。这个程序的主要功能是用来从指定的来源(这里是Usenet新闻组)收集信息,然后讲这些信息保存到指定的目的文件中(这里使用了两种形式:纯文本和html文件)。这个程序的用处有些类似于现在的博客订阅工具或者叫RSS订阅器。

先上代码,然后再来逐一分析:

from nntplib import NNTPfrom time import strftime,time,localtimefrom email import message_from_stringfrom urllib import urlopenimport textwrapimport reday = 24*60*60def wrap(string,max=70):    '''    '''    return ''.join(textwrap.wrap(string)) + ''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 = bodyclass 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(''.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.bodyclass HTMLDestination:    def __init__(self,filename):        self.filename = filename    def receiveItems(self,items):        out = open(self.filename,'w')        print &gt;&gt; out,'''                         <title>Today's News</title>                        <h1>Today's News        '''        print &gt;&gt; out, '<ul>'        id = 0        for item in items:            id += 1            print &gt;&gt; out, '<li><a>%s</a></li>' % (id,item.title)        print &gt;&gt; out, '</ul>'        id = 0        for item in items:            id += 1            print &gt;&gt; out, '<h2><a>%s</a></h2>' % (id,item.title)            print &gt;&gt; out, '<pre class="brush:php;toolbar:false">%s
' % item.body        print >> out, '''                        '''def runDefaultSetup():    agent = NewsAgent()    bbc_url = 'http://news.bbc.co.uk/text_only.stm'    bbc_title = r'(?s)a href="[^" rel="external nofollow" ]*">s*s*(.*?)s*'    bbc_body = r'(?s)s*
s*(.*?)s*

这个程序,首先从整体上进行分析,重点部分在于NewsAgent,它的作用是存储新闻来源,存储目标地址,然后在分别调用来源服务器(NNTPSource以及SimpleWebSource)以及写新闻的类(PlainDestination和HTMLDestination)。所以从这里也看的出,NNTPSource是专门用来获取新闻服务器上的信息的,SimpleWebSource是获取一个url上的数据的。而PlainDestination和HTMLDestination的作用很明显,前者是用来输出获取到的内容到终端的,后者是写数据到html文件中的。

立即学习“Python免费学习笔记(深入)”;

有了这些分析,然后在来看主程序中的内容,主程序就是来给NewsAgent添加信息源和输出目的地址的。

这确实是个简单的程序,不过这个程序可是用到了分层了。