[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(''',"\'")
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()