Created
July 17, 2015 11:06
-
-
Save ctroncoso/4dc10823a58fb07a35b6 to your computer and use it in GitHub Desktop.
Parser para cámara de diputados
This file contains hidden or 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
# uso | |
# ruby dipa.rb "http://diputados.cl/trabajamos/sala_votacion_detalle.aspx?prmId=21311" | |
require 'uri' | |
require 'open-uri' | |
require 'nokogiri' | |
require "awesome_print" | |
require 'yaml' | |
class VotacionesDiputados | |
attr_accessor :base, :stats | |
Estadistica = Struct.new(:nombre, :partido, :voto) | |
def initialize(url) | |
@base_url = url | |
@doc = Nokogiri::HTML(open(url)) | |
@stats = Array.new | |
@base = Array.new | |
populate | |
end | |
def por_votacion | |
result = Hash.new | |
#agrupar tipo de votación | |
votaciones = @stats.map(&:voto).uniq | |
#por cada tipo de votación, agrupar y contar por partido | |
votaciones.each do |v| | |
@stats.select{|i| i.voto == v}.each do |i| | |
result[v] = Hash.new 0 unless result[v] | |
result[v][i.partido] += 1 | |
end | |
end | |
result | |
end | |
def por_partido | |
result = Hash.new | |
#agrupar tipo de votación | |
partidos = @stats.map(&:partido).uniq | |
#por cada tipo de votación, agrupar y contar por partido | |
partidos.each do |p| | |
@stats.select{|i| i.partido == p}.each do |i| | |
result[p] = Hash.new 0 unless result[p] | |
result[p][i.voto] += 1 | |
end | |
end | |
result | |
end | |
protected | |
def populate | |
load_votación | |
load_partido | |
@base.each do |v| | |
@stats << Estadistica.new(v[:nombre], v[:partido], v[:voto]) | |
end | |
end | |
def load_votación | |
{"AFavor" => :a_favor, "Encontra" => :en_contra, "Abstencion" => :abstencion}.each do |xpath, voto| | |
@doc.xpath("//*[contains(@id,'#{xpath}')]//a").each do |i| | |
@base << { | |
:voto => voto, | |
:href => URI::join(@base_url,i['href']).to_s, | |
:nombre => i.text.gsub(/\r\n/, '').strip, | |
} | |
end | |
end | |
end | |
def load_partido | |
@base.each do |i| | |
i[:partido] = Nokogiri::HTML(open(i[:href])).xpath('//*[@id="ficha"]/div[3]/div[3]/p[1]').text.gsub(/\r\n/, '').strip.to_sym | |
end | |
end | |
end | |
url = ARGV[0] | |
votacion=VotacionesDiputados.new(url) | |
puts votacion.por_votacion.to_yaml | |
puts votacion.por_partido.to_yaml |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment