Skip to content
Extraits de code Groupes Projets
Valider b0d550a6 rédigé par Bastien Le Querrec's avatar Bastien Le Querrec
Parcourir les fichiers

prefdpt: ajoute le support des menus déroulants

parent 3ddfe070
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -42,6 +42,7 @@ class Attrap_prefdpt(Attrap): ...@@ -42,6 +42,7 @@ class Attrap_prefdpt(Attrap):
# Liste des widgets à analyser (sera remplie au moment de l'initialisation, mais peut être surchargée par la classe de préfecture de département) # Liste des widgets à analyser (sera remplie au moment de l'initialisation, mais peut être surchargée par la classe de préfecture de département)
widgets = [] widgets = []
select_widgets = []
# Est-ce qu'on inclue les widgets des cartes blanches et grises ? Par défaut oui, mais il peut être nécessaire de les désactiver sur certaines préfectures # Est-ce qu'on inclue les widgets des cartes blanches et grises ? Par défaut oui, mais il peut être nécessaire de les désactiver sur certaines préfectures
include_grey_card_widget = True include_grey_card_widget = True
...@@ -83,6 +84,16 @@ class Attrap_prefdpt(Attrap): ...@@ -83,6 +84,16 @@ class Attrap_prefdpt(Attrap):
else: else:
return self.regex.get(key, None) return self.regex.get(key, None)
class DptSelectWidget:
"""Une classe représentant un menu déroulant sur le site d'une préfecture de département."""
def __init__(self, name, regex=None, css_path=None, follow_link_on_unrecognised_date=True, exclude=[]):
self.name = name
self.regex = regex
self.css_path = css_path
self.follow_link_on_unrecognised_date = follow_link_on_unrecognised_date
self.exclude = exclude
def __init__(self, data_dir): def __init__(self, data_dir):
"""Une classe générique permettant d'analyser les préfectures de département en fonction de certains paramètres.""" """Une classe générique permettant d'analyser les préfectures de département en fonction de certains paramètres."""
...@@ -125,7 +136,8 @@ class Attrap_prefdpt(Attrap): ...@@ -125,7 +136,8 @@ class Attrap_prefdpt(Attrap):
while not self.page_urls_to_parse == []: while not self.page_urls_to_parse == []:
page_url = self.page_urls_to_parse[-1] page_url = self.page_urls_to_parse[-1]
page_content = self.get_page(page_url, 'get').content # On récupère le HTML de la page page_content = self.get_page(page_url, 'get').content # On récupère le HTML de la page
self.parse_widgets(page_content) # On parse les cartes blanches self.parse_widgets(page_content) # On parse les cartes
self.parse_select_widgets(page_url, page_content) # On parse les menus déroulants
for element in self.get_raa_elements(page_content): # On cherche les RAA for element in self.get_raa_elements(page_content): # On cherche les RAA
self.elements.append(element) self.elements.append(element)
self.page_urls_to_parse.remove(page_url) # On supprime la page de la liste de celles à parser self.page_urls_to_parse.remove(page_url) # On supprime la page de la liste de celles à parser
...@@ -134,7 +146,7 @@ class Attrap_prefdpt(Attrap): ...@@ -134,7 +146,7 @@ class Attrap_prefdpt(Attrap):
self.mailer() self.mailer()
def parse_widgets(self, page_content): def parse_widgets(self, page_content):
# Pour chaque widget paramétré, on le cherche sur la page # Pour chaque widget paramétré qui n'est pas de type select, on le cherche sur la page
for widget in self.widgets: for widget in self.widgets:
cards = [] cards = []
# Si n'appelle pas la même fonction le widget a prévu un pager ou non # Si n'appelle pas la même fonction le widget a prévu un pager ou non
...@@ -191,6 +203,35 @@ class Attrap_prefdpt(Attrap): ...@@ -191,6 +203,35 @@ class Attrap_prefdpt(Attrap):
if date_is_correct or (date.year == 9999 and widget.follow_link_on_unrecognised_date): if date_is_correct or (date.year == 9999 and widget.follow_link_on_unrecognised_date):
self.page_urls_to_parse.append(card['url']) self.page_urls_to_parse.append(card['url'])
def parse_select_widgets(self, page_url, page_content):
for select_widget in self.select_widgets:
# Les widgets select fonctionnent différemment : chaque valeur option doit être testée pour trouver une date, et si la date correspond
# à la date recherchée la requête POST est envoyée, puis le résultat est analysé par get_raa_elements()
# On charge le parser
soup = BeautifulSoup(page_content, 'html.parser')
# On récupère les select
for select in soup.select(select_widget.css_path):
# On récupère les option de chaque select
for option in select.find_all('option'):
if not option['value'] == "" and option['title'].strip() not in select_widget.exclude:
# On estime la date à partir du nom de fichier
date = Attrap.guess_date(option['title'].strip(), select_widget.regex)
# Si la date estimée correspond à la plage d'analyse ou si follow_link_on_unrecognised_date est à True,
# on demande au serveur les détails du RAA
if (date.year < 9999 and date >= self.not_before) or (date.year == 9999 and select_widget.follow_link_on_unrecognised_date):
page_content = self.get_page(
page_url,
'post',
{
select['id']: option['value']
}
).content
for element in self.get_raa_elements(page_content):
self.elements.append(element)
def get_raa_elements(self, page_content): def get_raa_elements(self, page_content):
elements = [] elements = []
# On charge le parser # On charge le parser
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter