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('&#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()





Répondre à