diff --git a/Attrap_prefdpt.py b/Attrap_prefdpt.py index 2578ada8f205dd594e91f9a1bb637f8e8b26ec8c..337b46508f827a1bcb77380eddd0185381caca6b 100644 --- a/Attrap_prefdpt.py +++ b/Attrap_prefdpt.py @@ -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) 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 include_grey_card_widget = True @@ -83,6 +84,16 @@ class Attrap_prefdpt(Attrap): else: 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): """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): while not self.page_urls_to_parse == []: 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 - 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 self.elements.append(element) 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): self.mailer() 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: cards = [] # 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): if date_is_correct or (date.year == 9999 and widget.follow_link_on_unrecognised_date): 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): elements = [] # On charge le parser