Created
May 23, 2011 16:43
-
-
Save archiloque/987023 to your computer and use it in GitHub Desktop.
Scrappe les décisions du conseil constitutionel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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