Skip to content

Instantly share code, notes, and snippets.

@ctroncoso
Created July 17, 2015 11:06
Show Gist options
  • Save ctroncoso/4dc10823a58fb07a35b6 to your computer and use it in GitHub Desktop.
Save ctroncoso/4dc10823a58fb07a35b6 to your computer and use it in GitHub Desktop.
Parser para cámara de diputados
# 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