[CBLX] annuaire électronique - correction

[ Thread Index | Date Index | More lists.tuxfamily.org/carrefourblinux Archives ]


bonjour,
une petite correction pour l'annuaire en console : il ne traitait pas les numéros à 4 chiffres, genre 39 00. (une erreur dans la regex).
C'est réparé.
Cordialement
Erwin
#! /usr/bin/env python
# -*- coding: utf-8 -*-

# ------------------------------------------------------------
# script pour consultation de l'annuaire électronique français
# auteur E.Bliesenick
# erwb19@xxxxxxx
# -------------------------------------------------------------

import sys
import string
import re
import pycurl
import unicodedata

# ---------------------------------------------------------------------------

global page
global ligne
global nb_resultats
global index_resultat
global numero
global adresse
global nom
global activite
global quoiqui
global ou
global originale
global corrigee

# ---------------------------------------------------------------------------

def connexion():
	site = "http://www.pagesjaunes.fr/pagesblanches/recherche?quoiqui="+quoiqui+"&ou="+ou+"&proximite=0";
	with open('result.html', 'wb') as f:
			c = pycurl.Curl()
			c.setopt(c.URL, site)
			c.setopt(c.WRITEDATA, f)
			c.perform()
			c.close()

# ---------------------------------------------------------------------------

def cree_page():
	global page
	global ligne
	f=open('result.html','r+')
	page=f.read()
	ligne = string.split(page,'\n')
	ligne.insert(0,'')

# ---------------------------------------------------------------------------

def cherche_nombre_resultats():
	global nb_resultats
	try:
		regex = re.compile('</h1><span class=\"denombrement\"><strong id=\"SEL-nbresultat\">(.*)</strong>')
		nb = regex.search(page)
		n_resultats = nb.group(1)
	except AttributeError:
		n_resultats='0'
	nb_resultats=int(n_resultats)
	if nb_resultats > 20:
		nb_resultats = 20

# ---------------------------------------------------------------------------

def indexe_resultats():
	en_tete = '<header class="v-card">'
	for i in range(1, len(ligne)):
		if ligne[i] == en_tete:
			index_resultat.append(i)
	index_resultat.append(i+1)

# ---------------------------------------------------------------------------
		
def extrait_resultat(no):	
	name = False
	pro = False
	addr = False
	number = False
	for i in range(index_resultat[no],index_resultat[no+1]):
		if ligne[i].find('denomination-links') != -1:
			s = ligne[i+1]
			nom.append(corrige(s))
			name = True
			
		if ligne[i].find('<div class="adresse-container">') != -1:
		  adr = ligne[i+2]
		  adresse.append(corrige(adr))
		  addr = True
		  
		if ligne[i].find('ACTIVITES-PRO') != -1: # est-ce un professionnel ?
			s = ligne[i+1]
			s = s.replace("</a>", '')
			activite.append(corrige(s))
			pro = True
		  
		#~ if ligne[i].find('<strong class="num" title="') != -1:
			#~ try:
				#~ s = num_regex_10.search(ligne[i])
				#~ numero.append(s.group(1))
				#~ number = True
			#~ except AttributeError:
				#~ try:
					#~ s = num_regex_4.search(ligne[i])
					#~ numero.append(s.group(1))
					#~ number = True
				#~ except:
					#~ number = False
			
		if ligne[i].find('<strong class="num" title="') != -1:
			try:
				s = num_regex.search(ligne[i])
				numero.append(s.group(1))
				number = True
			except AttributeError:
				number = False
			
	if not name:
		nom.append('')
	if not addr:
		adresse.append('')
	if not pro:
		activite.append('')
	if not number:
		numero.append('')
		
# ---------------------------------------------------------------------------

def corrige(chaine):
	chaine = chaine.replace('&#039;',"\'")
	chaine = chaine.replace('&nbsp;',' ')
	chaine = chaine.replace('&amp;','&')
	chaine = chaine.replace('</header>',' ')
	chaine = chaine.replace('</span>','')
	chaine =' '.join(filter(None,chaine.split(' '))) # élimine espaces superflus
	return chaine

# ---------------------------------------------------------------------------

def affichage_resultats():
	if nb_resultats == 0:
		print "aucun résultat trouvé pour ",quoiqui," à ",ou
	elif nb_resultats == 1:
		print "un résultat trouvé pour ",quoiqui," à ",ou
		print nom[0],adresse[0],"tél :",numero[0],activite[0]
	else:
		print nb_resultats, " résultats trouvés pour ",quoiqui," à ",ou
		for i in range(0, nb_resultats):
			print nom[i],adresse[i],"tél :",numero[i],activite[i]

# ---------------------------------------------------------------------------

def correction(ch):
	for c, s in zip(originale, corrigee):
		ch = ch.replace(c, s)
	return ch
	
# ---------------------------------------------------------------------------

def init():
	global nom
	global adresse
	global numero
	global activite
	global index_resultat
	global adr_regex
	global num_regex_10
	global num_regex_4
	global num_regex
	global nb_resultats
	global originale
	global corrigee
	
	nb_resultats = 0
	index_resultat = []
	nom = []
	adresse = []
	numero = []
	activite = []
	
	adr_regex = re.compile('<div class=\"adresse-container\">(.*)>(.*)')
	# numéros à 10 chiffres
	num_regex_10 = re.compile('<strong class="num" title=\"(\d{2} ?\d{2} ?\d{2} ?\d{2} ?\d{2})')
	# numéros à 4 chiffres (ex 36 44)
	num_regex_4 = re.compile('<strong class="num" title=\"(\d{2} ?\d{2})')
	# numéros à 10 ou 4 chiffres
	num_regex = re.compile('<strong class="num" title=\"([0-9]{2}([ ..-]?[0-9]{2}){1,4})')
	
	originale = ['à','â','ä','ç','é','è','ê','ë','î','ï','ô','ö','ù','û','ü',' ','-']
	corrigee  = ['a','a','a','c','e','e','e','e','i','i','o','o','u','u','u','+','+']

# ---------------------------------------------------------------------------

init()

if len(sys.argv) == 3: # appel à partir d'emacs ou depuis la console avec arguments
	quoiqui = correction(sys.argv[1])
	ou = correction(sys.argv[2])
else: # appel depuis la console sans arguments
	quoiqui = correction(raw_input("qui "))
	ou = correction(raw_input("ou "))
	
if quoiqui != '' and ou != '':
	connexion()
else:
	print "pas assez de données"
	sys.exit(0)

cree_page()
cherche_nombre_resultats()
indexe_resultats()
for i in range(0,nb_resultats):
	extrait_resultat(i)

affichage_resultats()







Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/