from pyquery import PyQuery pq = PyQuery('http://www.resultados.gob.ar/resultados/04/DDN04999.htm') listas = [pq(th).text() for th in pq('table#TVOTOS tbody tr th')] listas votos = [int(pq(td).text().replace('.', '')) for td in pq('table#TVOTOS tbody tr td.votlista')] votos %load http://tokland.googlecode.com/svn-history/r395/trunk/dhondt/dhondt.py #!/usr/bin/python """ Calculate seats distribution according to the D'Hondt method. Author: Arnau Sanchez Site: http://code.google.com/p/tokland """ import operator from itertools import chain def merge(*dicts): """Merge dictionary d2 into d.""" return dict(chain.from_iterable(d.iteritems() for d in dicts)) def dhondt(polling, total_seats, min_percentage=5.0): """ Calculate seats distribution according to the D'Hondt method. Given a diccionary of (party, votes) pairs and the total seats to distribute, return a dictionary of (party, seats) pairs. >>> dvotes = {"a": 100, "b": 90, "c": 20, "d": 3} >>> sorted(dhondt(dvotes, 10, 5.0).items()) [('a', 5), ('b', 4), ('c', 1)] """ def _process(dvotes, dvotes_cur, pending_seats, results): """Return results for dvotes""" if not pending_seats: return results party, _ = max(dvotes_cur.items(), key=operator.itemgetter(1)) seats = results[party]+1 new_dvotes_cur = merge(dvotes_cur, {party: dvotes[party]/(seats+1)}) new_results = merge(results, {party: seats}) return _process(dvotes, new_dvotes_cur, pending_seats-1, new_results) total_votes = sum(polling.values()) dvotes = dict((party, votes) for (party, votes) in polling.items() if float(100*votes) / total_votes >= min_percentage) return _process(dvotes, dvotes, total_seats, dict.fromkeys(dvotes, 0)) dvotos = dict(zip(listas, votos)) sorted(dhondt(dvotos, 9, 0.0).items(), key=operator.itemgetter(1), reverse=True) afirmativos = int(pq('table.tablin tbody tr td.vot').eq(0).text().replace('.', '')) recurridos = int(pq('table.tablin tbody tr td.vot').eq(3).text().replace('.', '')) afirmativos, recurridos experimento1 = dvotos.copy() FIT = 'FRENTE DE IZQUIERDA Y DE LOS TRABAJADORES' for votos_recurridos in xrange(1, recurridos + 1): experimento1[FIT] = experimento1[FIT] + 1 if dhondt(experimento1, 9, 0.0)[FIT] == 1: print "Si %d votos recurridos fuesen del FIT, Liliana Olivero sería de diputada" % votos_recurridos break else: print "aún si los %d votos recurridos fuesen del FIT, Liliana no entra" % recurridos experimento2 = dvotos.copy() FIT = 'FRENTE DE IZQUIERDA Y DE LOS TRABAJADORES' UCR = 'UNION CIVICA RADICAL' for voto_ucr in xrange(1, experimento2[UCR] + 1): experimento2[UCR] = experimento2[UCR] - 1 if dhondt(experimento2, 9, 0.0)[FIT] == 1: print "Si la UCR obtuviese %d votos menos, Liliana Olivero sería de diputada" % voto_ucr break experimento3 = dvotos.copy() FIT = 'FRENTE DE IZQUIERDA Y DE LOS TRABAJADORES' UCR = 'UNION CIVICA RADICAL' for voto_ucr in xrange(1, experimento2[UCR] + 1): experimento3[UCR] = experimento3[UCR] - 1 experimento3[FIT] = experimento3[FIT] + 1 if dhondt(experimento3, 9, 0.0)[FIT] == 1: print "Si %d votos de la UCR fuesen del FIT, Liliana Olivero sería de diputada" % voto_ucr break (1185 / float(afirmativos)) * 100