Skip to content

Instantly share code, notes, and snippets.

@archiloque
Created May 23, 2011 16:43
Show Gist options
  • Save archiloque/987023 to your computer and use it in GitHub Desktop.
Save archiloque/987023 to your computer and use it in GitHub Desktop.
Scrappe les décisions du conseil constitutionel
# encoding: UTF-8
require 'open-uri'
require 'nokogiri'
require 'csv'
# Nettoie les caractères inutiles dans une chaine
def clean str
str.strip.gsub("\n", ' ').gsub(' ', ' ').gsub(' ', ' ').gsub(' ', ' ').gsub(' ', ' ').gsub(' ', ' ').gsub(' ', ' ')
end
# les types de décisions
TYPES = ['QPC', 'DC', 'LP', 'FNR', 'LOM', 'AN', 'SEN', 'PDR', 'REF', 'ELECT' 'D', 'I', 'AR16', 'NOM', 'RAPP', 'ORGA', 'AUTR', 'L']
# on va écrire dans ce fichier
CSV.open("conseil_constitutionel.csv", "w") do |csv|
# l'entête
csv << ["Année", "Numéro", "Date", "N°", "Type", "Intitulé", "Décision", "URL"]
# le point d'entrée
main_url = "http://www.conseil-constitutionnel.fr/conseil-constitutionnel/francais/les-decisions/acces-par-date/decisions-depuis-1959/les-decisions-depuis-1958.4614.html"
# dans cette page on récupère tous les liens qui sont dans le div #articlesArchives qui vont correspondre aux pages listant les décisions
Nokogiri::HTML(open(main_url)).search('#articlesArchives a').each do |a|
# le contenu du lien corespond à l'année
year = a.inner_text
url_decision = "http://www.conseil-constitutionnel.fr#{a[:href]}"
# on ouvre les liens un par un et on récupère les décisions qui sont les éléments li dans le div articles
Nokogiri::XML(open(url_decision), nil, 'UTF-8').search('#articles li').each do |decision|
# la conformance est dans une balise small si elle est là
if conformance = decision.at('small')
conformance = conformance.inner_text[1..-2]
end
# le lien contient les autres infos
link = decision.at('a')
link_text = link.inner_text
# position du -
index_dash = link_text.index('-')
# la date qui est avant le -
date = clean(link_text[0..(index_dash -1)])
# position d'un ° qui indiquerait la présence du numéro
index_id = link_text.index('°')
if index_id
# il y a un numéro : on prend le texte avant le °
id = clean(link_text[(index_id +2)..-1])
# on cherche le dernier espace du texte pour voir s'il est suivi du type de la décision
last_space = id.rindex(' ')
type = ''
if last_space
possible_type = id[(last_space + 1)..-1]
# si le type est un type connu on le sélectionne et on le retranche du texte
if TYPES.include? possible_type
type = possible_type
id = id[0..(last_space - 1)]
end
end
else
# pas de numéro
id = ''
type = ''
end
# on écrit le résultat dans le fichier
csv << [year, # l'année
decision[:value], # le numéro est dans l'attribut value de la décision
date, # la date
id, # l''id
type, # le type
clean(decision.at('em').inner_text), # l'intitulé
conformance, # la conformance
url_decision] # l'url de la décision
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment