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 # erw...@free.fr # ------------------------------------------------------------- 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(''',"\'") chaine = chaine.replace(' ',' ') chaine = chaine.replace('&','&') 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()