Maison  >  Article  >  développement back-end  >  tutoriel de base python projet quatre agrégation de nouvelles

tutoriel de base python projet quatre agrégation de nouvelles

不言
不言original
2018-04-03 09:17:341696parcourir

Cet article présente principalement en détail l'agrégation de nouvelles du Python Basic Tutorial Project 4. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer au livre

"Python Basic Tutorial". Le quatrième exercice est l'agrégation de nouvelles. . Un type d’application rare de nos jours, du moins je ne l’ai jamais utilisé, s’appelle aussi Usenet. La fonction principale de ce programme est de collecter des informations à partir de sources spécifiées (ici, les groupes de discussion Usenet), puis de sauvegarder ces informations dans des fichiers de destination spécifiés (deux formulaires sont utilisés ici : texte brut et fichiers HTML). L'utilisation de ce programme est quelque peu similaire à l'outil d'abonnement au blog actuel ou à l'abonné RSS.

Parcourez d'abord le code, puis analysez-le un par un :

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&#39;s News</title>
        </head>
        <body>
        <h1>Today&#39;s News</hi>
        &#39;&#39;&#39;
        print >> out, &#39;<ul>&#39;
        id = 0
        for item in items:
            id += 1
            print >> out, &#39;<li><a href="#" rel="external nofollow" >%s</a></li>&#39; % (id,item.title)
        print >> out, &#39;</ul>&#39;
        id = 0
        for item in items:
            id += 1
            print >> out, &#39;<h2><a name="%i">%s</a></h2>&#39; % (id,item.title)
            print >> out, &#39;<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*<' 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()

Ce programme devrait être analysé dans son ensemble d'abord Analyse, l'élément clé est NewsAgent, sa fonction est de stocker la source d'actualités, de stocker l'adresse cible, puis d'appeler le serveur source (NNTPSource et SimpleWebSource) et la classe d'écriture d'actualités (PlainDestination et HTMLDestination) respectivement. On voit donc ici que NNTPSource est spécialement utilisé pour obtenir des informations sur le serveur de nouvelles, et SimpleWebSource est utilisé pour obtenir des données sur une URL. Les fonctions de PlainDestination et HTMLDestination sont évidentes. Le premier est utilisé pour afficher le contenu obtenu sur le terminal, et le second est utilisé pour écrire des données dans le fichier HTML.

Avec ces analyses, examinons le contenu du programme principal. Le programme principal consiste à ajouter des sources d'informations et des adresses de destination de sortie à NewsAgent.

C'est en effet un programme simple, mais ce programme utilise la superposition.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn