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


Posted in Python onApril 02, 2018

《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实现在目录中查找指定文件的方法
Nov 11 Python
Python3自动签到 定时任务 判断节假日的实例
Nov 13 Python
python实现给scatter设置颜色渐变条colorbar的方法
Dec 13 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
Python可变参数会自动填充前面的默认同名参数实例
Nov 18 Python
python 使用opencv 把视频分割成图片示例
Dec 12 Python
pytorch实现建立自己的数据集(以mnist为例)
Jan 18 Python
如何在 Django 模板中输出 &quot;{{&quot;
Jan 24 Python
Python读取VOC中的xml目标框实例
Mar 10 Python
Python 如何创建一个简单的REST接口
Jul 30 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
Apr 02 #Python
python基础教程项目三之万能的XML
Apr 02 #Python
python opencv检测目标颜色的实例讲解
Apr 02 #Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 #Python
python基础教程项目二之画幅好画
Apr 02 #Python
通过Python 接口使用OpenCV的方法
Apr 02 #Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 #Python
You might like
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
2007/04/20 Javascript
JavaScript入门教程(3) js面向对象
2009/01/31 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
jQuery中parents()和parent()的区别分析
2014/10/28 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
js分页之前端代码实现和请求处理
2017/08/04 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
2020/04/14 Javascript
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
详解Python发送邮件实例
2016/01/10 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
西门豹教学反思
2014/02/04 职场文书
交通事故协议书
2014/04/15 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
病假证明模板
2015/06/19 职场文书
活动简报范文
2015/07/22 职场文书
Java实现房屋出租系统详解
2021/10/05 Java/Android
利用Python多线程实现图片下载器
2022/03/25 Python
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python