begin process at 2010 07 29 16:02:44
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > LIRE ET PARSER UN FICHIER NZB ( XML AVEC SAX)

LIRE ET PARSER UN FICHIER NZB ( XML AVEC SAX)


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :nzb, parse, sax, xml, usenet Niveau :Débutant Date de création :23/10/2007 Vu / téléchargé :3 768 / 86

Auteur : azalsup

Ecrire un message privé
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 Description

Ce petit script permet de lire et d'extraire les informations contenus dans un fichier nzb

C'est une classe qui fait partie d'un projet plus important dans le but et de réaliser un grabeur de news.

Cet outils codé entièrement en python permetera de telecharger des fichiers sur les usenet binaires a partir d'un fichier Nzb.

Temps de travail : 2H

Source

  • # -*- coding: utf-8 -*-
  • #-#####################################################
  • #- Classe permetant de gerer les fichiers Nzb #
  • #-
  • #- Ce code n'est que la partie d'un projet plus vaste dans le but est de réaliser un client usenet
  • #- en python ou en C++
  • #- Ce code doit etre amélioré notament en geran au mieu les exceptions et en ajputant d'autres fonctionnalite
  • #- temps passe a coder et valider = 2H
  • #- Coded by azalsup@free.fr
  • #- Code ouvert sans conditions
  • #-
  • #-#####################################################
  • __revision__ = 0.1
  • # Les includes se font par ici
  • from xml.sax import make_parser
  • from xml.sax.handler import ContentHandler
  • #Les fonctions elementaires necessaires au bon fonctionnement du programme
  • def END() :
  • """Areter le programme"""
  • sys.exit()
  • def ERROR(msg):
  • """Affiche un message d'erreur"""
  • print '#'*len(msg)
  • print msg
  • print '#'*len(msg)
  • END()
  • def WARNING(msg):
  • """Affiche un message de prevention"""
  • print '*'*len(msg)
  • print msg
  • print '*'*len(msg)
  • def INFO(msg):
  • """Affiche un message d'information"""
  • print '@'*len(msg)
  • print msg
  • print '@'*len(msg)
  • #Classe pour gerer un segment de fichier
  • class NzbSegment :
  • """Classe pour refferencer un segment d'un fichier"""
  • def __init__(self, bytes , number , content = ''):
  • """Constructeur de la classe"""
  • self.bytes = bytes
  • self.number = number
  • self.content = content
  • def addContent(self, content):
  • """Modifier la valeur de self.content"""
  • self.content += content
  • def getContent(self):
  • """Retourne la valeur de self.content"""
  • return self.content
  • #Classe pour stocker les ref. d'un fichier du Nzb
  • class NzbFile:
  • """Les ref. d'un fichier refference dans le Nzb"""
  • def __init__(self, subject, date , poster):
  • """Constructeur de la classe"""
  • self.subject = subject
  • self.date = date
  • self.poster = poster
  • self.groups = []
  • self.segments = []
  • def addGroup(self, group):
  • """Ajouter un groupe"""
  • self.groups.append(group)
  • def addGroups(self, groups) :
  • """Ajouter plusieurs groupes a la fois"""
  • self.groups += groups
  • def addSegment(self, segment):
  • """Ajouter un segment"""
  • self.segments.append(segment)
  • #Classe pour parser le fichier Nzb
  • class NzbHandler(ContentHandler) :
  • '''Classe pour parser le fichier nzb'''
  • def __init__(self):
  • """initialisation"""
  • self.files = []
  • self.nbNzb = 0
  • #Si cette valeur est a True on est dans une balise nzb
  • self.e_nzb = False
  • self.tmpFile = None
  • self.tmpGroups = None
  • self.tmpGroup = None
  • self.tmpSegments = None
  • self.tmpSegment = None
  • def addFile(self, file):
  • """ Ajouter un fichier"""
  • self.files.append(file)
  • def startDocument(self):
  • """fonction appelée lorsque le parser rencontre le premier élement"""
  • pass
  • def startElement(self, name, attrs):
  • """fonction appelée lorsque le parser rencontre une balise ouvrante"""
  • if name == "nzb" :
  • self.nbNzb += 1
  • self.e_nzb = True
  • elif name == "file" and self.e_nzb:
  • self.tmpFile = NzbFile(attrs.getValue('subject'), attrs.getValue('date') , attrs.getValue('poster'))
  • elif name == 'groups' and self.tmpFile != None :
  • self.tmpGroups = []
  • elif name == 'group' and self.tmpGroups != None :
  • self.tmpGroup = ''
  • elif name == 'segments' and self.tmpFile != None :
  • self.tmpSegments = []
  • elif name == 'segment' and self.tmpSegments != None :
  • self.tmpSegment = NzbSegment(attrs.getValue('bytes') , attrs.getValue('number') )
  • def endElement(self, name):
  • """fonction appelée lorsque le parser rencontre une balise fermante"""
  • if name == "nzb" :
  • self.e_nzb = False
  • elif name == "file" and self.e_nzb:
  • self.files.append(self.tmpFile)
  • self.tmpFile = None
  • elif name == 'groups' and self.tmpFile != None :
  • self.tmpFile.addGroups(self.tmpGroups)
  • self.tmpGroups = None
  • elif name == 'group' and self.tmpGroups != None :
  • self.tmpGroups.append(self.tmpGroup)
  • self.tmpGroup = None
  • elif name == 'segments' and self.tmpFile != None :
  • self.tmpSegments = None
  • elif name == 'segment' and self.tmpSegments != None :
  • self.tmpFile.addSegment(self.tmpSegment)
  • self.tmpSegment = None
  • def characters(self, chrs):
  • """fonction appelée lorsque le parser rencontre des données dans un élement"""
  • if self.tmpGroup != None :
  • self.tmpGroup += chrs
  • elif self.tmpSegment != None :
  • self.tmpSegment.addContent(chrs)
  • def endDocument(self):
  • """fonction appelée lorsque le parser rencontre le dernier élement"""
  • pass
  • # Entree principale du programme
  • if __name__ == "__main__" :
  • _doc = NzbHandler()
  • _saxparser = make_parser()
  • _saxparser.setContentHandler(_doc)
  • _datasource = open("test.nzb","r")
  • _saxparser.parse(_datasource)
  • for _f in _doc.files :
  • print "#"*8
  • print "Sujet :",_f.subject
  • print "Date :",_f.date
  • print "Poster :",_f.poster
  • print "Liste des groupes :"
  • print "___________________"
  • for _g in _f.groups :
  • print " -", _g
  • print "Liste des segments :"
  • print "____________________"
  • for _s in _f.segments :
  • print _s.bytes,'-', _s.bytes, '-', _s.number, '-', _s.content
# -*- coding: utf-8	  -*-

#-#####################################################
#- Classe permetant de gerer les fichiers Nzb						#
#-
#-  Ce code n'est que la partie d'un projet plus vaste dans le but est de réaliser un client usenet
#- en python ou en C++
#- Ce code doit etre amélioré notament en geran au mieu les exceptions et en ajputant d'autres fonctionnalite
#- temps passe a coder et valider = 2H 
#- Coded by azalsup@free.fr
#- Code ouvert sans conditions
#-
#-#####################################################

__revision__ = 0.1

# Les includes se font par ici
from xml.sax import make_parser
from xml.sax.handler import ContentHandler 


#Les fonctions elementaires necessaires au bon fonctionnement du programme
def END() :
	"""Areter le programme"""
	sys.exit()

def ERROR(msg):
	"""Affiche un message d'erreur"""
	
	print '#'*len(msg)
	print msg
	print '#'*len(msg)
	END()

def WARNING(msg):
	"""Affiche un message de prevention"""
	
	print '*'*len(msg)
	print msg
	print '*'*len(msg)
	
def INFO(msg):
	"""Affiche un message d'information"""
	
	print '@'*len(msg)
	print msg
	print '@'*len(msg)

#Classe pour gerer un segment de fichier
class NzbSegment :
	"""Classe pour refferencer un segment d'un fichier"""
		
	def __init__(self, bytes , number , content = ''):
		"""Constructeur de la classe"""
		self.bytes = bytes
		self.number = number
		self.content = content
	
	def addContent(self, content):
		"""Modifier la valeur de self.content"""
		self.content += content
		
	def getContent(self):
		"""Retourne la valeur de self.content"""
		return self.content
		
#Classe pour stocker les ref. d'un fichier du Nzb
class NzbFile:
	"""Les ref. d'un fichier refference dans le Nzb"""
		
	def __init__(self, subject, date , poster):
		"""Constructeur de la classe"""
		self.subject = subject
		self.date = date
		self.poster = poster
		
		self.groups = []
		self.segments = []
		
		
	def addGroup(self, group):
		"""Ajouter un groupe"""
		self.groups.append(group)
	
	def addGroups(self, groups) :
		"""Ajouter plusieurs groupes a la fois"""
		self.groups += groups
		
	def addSegment(self, segment):
		"""Ajouter un segment"""
		self.segments.append(segment)
	
	
	
#Classe pour parser le fichier Nzb
class NzbHandler(ContentHandler) :
	'''Classe pour parser le fichier nzb'''
		
	def __init__(self):
		"""initialisation"""
		self.files = []
		self.nbNzb = 0
		
		#Si cette valeur est a True on est dans une balise nzb
		self.e_nzb = False
		self.tmpFile = None
		self.tmpGroups = None
		self.tmpGroup = None
		self.tmpSegments = None
		self.tmpSegment = None
	
	def addFile(self, file):
		""" Ajouter un fichier"""
		self.files.append(file)
		
		
	def startDocument(self):
		"""fonction appelée lorsque le parser rencontre le premier élement"""
		pass
	
	def startElement(self, name, attrs):
		"""fonction appelée lorsque le parser rencontre une balise ouvrante"""
		if name == "nzb" :
			self.nbNzb += 1
			self.e_nzb = True
		
		elif name == "file" and self.e_nzb:
			self.tmpFile = NzbFile(attrs.getValue('subject'), attrs.getValue('date') , attrs.getValue('poster'))
			
		elif name == 'groups' and self.tmpFile != None :
			self.tmpGroups = []
	
		elif name == 'group' and self.tmpGroups != None :
			self.tmpGroup = ''	
			
		elif name == 'segments' and self.tmpFile != None :
			self.tmpSegments = []
	
		elif name == 'segment' and self.tmpSegments != None :
			self.tmpSegment = NzbSegment(attrs.getValue('bytes') , attrs.getValue('number') )
			
	def endElement(self, name):
		"""fonction appelée lorsque le parser rencontre une balise fermante"""
		if name == "nzb" :
			self.e_nzb = False
		
		elif name == "file" and self.e_nzb:
			self.files.append(self.tmpFile)
			self.tmpFile = None
			
		elif name == 'groups' and self.tmpFile != None :
			self.tmpFile.addGroups(self.tmpGroups)
			self.tmpGroups = None
	
		elif name == 'group' and self.tmpGroups != None :
			self.tmpGroups.append(self.tmpGroup)
			self.tmpGroup = None
			
		elif name == 'segments' and self.tmpFile != None :
			self.tmpSegments = None
	
		elif name == 'segment' and self.tmpSegments != None :
			self.tmpFile.addSegment(self.tmpSegment)
			self.tmpSegment = None
			
	def characters(self, chrs):
		"""fonction appelée lorsque le parser rencontre des données dans un élement"""
		if self.tmpGroup != None :
			self.tmpGroup += chrs
			
		elif self.tmpSegment != None :
			self.tmpSegment.addContent(chrs)
			
	def endDocument(self):
		"""fonction appelée lorsque le parser rencontre le dernier élement"""
		pass
	
# Entree principale du programme	
if __name__ == "__main__" :
	
	_doc = NzbHandler()
	_saxparser = make_parser()
	_saxparser.setContentHandler(_doc)

	_datasource = open("test.nzb","r")
	_saxparser.parse(_datasource)
	
	for _f in _doc.files :
		print "#"*8
		
		print "Sujet :",_f.subject
		print "Date :",_f.date
		print "Poster :",_f.poster
		
		print "Liste des groupes :"
		print "___________________"
		for _g in _f.groups :
			print " -", _g
		
		print "Liste des segments :"
		print "____________________"
		for _s in _f.segments :
			print _s.bytes,'-', _s.bytes, '-', _s.number, '-', _s.content


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip CLASSE NTTP

 Sources de la même categorie

Source avec Zip SCRIPT PERMETTANT DE DÉCODER LA STRUCTURE SECONDAIRE D'UNE P... par Basilio
SUPPRESSION par Rano Its
Source avec Zip RECONNAISSANCE VOCALE par brennal
CONVERTISSEUR DE TEMPÉRATURE par skizo00o
Source avec Zip Source avec une capture I.A. (DÉBUTANT) par Rano Its

 Sources en rapport avec celle ci

RÉCUPÉRER LES PHOTOS D'UN ALBUM SUR ZOOOMR par KimbleMandel
Source avec Zip Source avec une capture JEU DU DÉMINEUR par KimbleMandel
Source avec Zip CLASSE NTTP par azalsup
Source avec Zip CLIENT/SERVEUR XMLRPC par balisong1

Commentaires et avis

Commentaire de snipeur666 le 24/04/2008 18:34:13

bonjour, je suis sur le point de faire un grabbeur de newsgroup type newsbin ou grabit, et j'aimerais savoir comment convertir votre code en visual basic ou sinon c++ car j'ai installé visual c++ express 2005 et comme je suis debutant j'ai copier coller le code et rien n'a fonctionné. Ensuite (1 journée apres) cad aujourd'hui j'ai installé python 2.5 dans sa derniere version et je ne vois pas ou copier coller le code afin que ça me donne un executable de type .EXE Pouvez vous m'aider svp,
Très Cordialement,
SNiPER

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

XML Dom [ par MHI ] Voici un exemple et une petite explication sympathique que j'ai trouvé sure developpez.com traitant de XML et de l'API DOM :'Utilisation de l'API DOM python debutant [ par supai ] print "début" # début procédure from os import chdir chdir("/Volumes/GERTEX/_test/") import shutil, string, re obfic = open("taglist.xml","r") # Le Importer la Base de registre windows en xml pour la réutiliser en xml. [ par Psychokenshin ] Bonjour à tous, Je cherche donc à exporter ma base de registre windows dans un fichier xml et ce de façon à pouvoir l'utiliser facilement dans un dic


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Juillet 2010
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales