from pyquery import PyQuery def parse_telegrama(url): pq = PyQuery(url) resultado_mesa = {} for tr in pq('.tablon tbody tr, .TVOTOS tbody tr'): resultado_mesa[pq('th', tr).text()] = int(pq('td', tr).text().replace('.', '')) return resultado_mesa escrutinio = parse_telegrama('http://www.resultados.gob.ar/telegramas/04/001/0013J/040010013J2669.htm') escrutinio sum(escrutinio.values()) def crawl(base_url): """ Devuelve un arbol con los resultados de cada mesa Puede tardar mucho. >>> crawl("http://www.resultados.gob.ar/telegramas/IMUN04.htm") """ arbol = {} pq = PyQuery(base_url) pq = pq.make_links_absolute(base_url='http://www.resultados.gob.ar/telegramas/') for anchor in pq('a'): url = pq(anchor).attr('href') if '04/' in url: # mesa data = parse_telegrama(url) else: # abrir nueva rama data = crawl(url) arbol[pq(anchor).text()] = data return arbol %install_ext https://gist.github.com/mgaitan/7207448/raw/ce87e68226ef4ad12cb1aabfa42ebacaf66b3bce/django_orm_magic.py %load_ext django_orm_magic %%django_orm from django.db import models from django.db.models import Sum class Municipio(models.Model): nombre = models.CharField(max_length=100) def __unicode__(self): return self.nombre class Circuito(models.Model): numero = models.CharField(max_length=100) municipio = models.ForeignKey('Municipio', null=True) def __unicode__(self): return u"Circuito %s (%s)" % (self.numero, self.municipio) class Mesa(models.Model): circuito = models.ForeignKey('Circuito', null=True) numero = models.CharField(max_length=100, unique=True) url = models.URLField() @property def computados(self): return self.votomesa_set.aggregate(Sum('votos'))['votos__sum'] def __unicode__(self): return u"Mesa %s (%s)" % (self.numero, self.circuito) class Opcion(models.Model): # partido, blanco, etc. nombre = models.CharField(max_length=100, unique=True) def __unicode__(self): return self.nombre class VotoMesa(models.Model): mesa = models.ForeignKey('Mesa') opcion = models.ForeignKey('Opcion') votos = models.IntegerField() def __unicode__(self): return u"%s: %d" % (self.opcion, self.votos) class Meta: unique_together = ('mesa', 'opcion') from django.db import IntegrityError def crawl2(base_url, nivel='prov', parent=None): pq = PyQuery(base_url) pq = pq.make_links_absolute(base_url='http://www.resultados.gob.ar/telegramas/') anchors = pq('a') if nivel == 'circuito' and parent and parent.mesa_set.count() == len(anchors): return for anchor in anchors: url = pq(anchor).attr('href') text = pq(anchor).text() if nivel == 'circuito': # mesa try: mesa = Mesa.objects.create(numero=text, circuito=parent, url=url) except IntegrityError: continue for opcion, votos in parse_telegrama(url).iteritems(): opcion, _ = Opcion.objects.get_or_create(nombre=opcion) try: VotoMesa.objects.create(mesa=mesa, opcion=opcion, votos=votos) except: #not unique continue elif nivel == 'prov': municipio, _ = Municipio.objects.get_or_create(nombre=text) crawl2(url, nivel="muni", parent=municipio) elif nivel == 'muni': circuito, _ = Circuito.objects.get_or_create(numero=text, municipio=parent) crawl2(url, nivel="circuito", parent=circuito) !wget -r http://lab.nqnwebs.com/descargas/db.sqlite # todas las opciones de voto for opcion in Opcion.objects.all(): print opcion #total votos blancos en Capital from django.db.models import Sum cap = Municipio.objects.get(nombre='001 - Capital') VotoMesa.objects.filter(mesa__circuito__municipio=cap, opcion__nombre='Votos en blanco').aggregate(Sum('votos')) Fit = Opcion.objects.get(nombre='FRENTE DE IZQUIERDA Y DE LOS TRABAJADORES') from IPython.display import display_html, HTML for mesa in Mesa.objects.filter(votomesa__votos=0, votomesa__opcion=Fit): if mesa.computados != 0: display_html(HTML("%s - Total computados: %d" % (mesa.url, mesa, mesa.computados))) from django.db.models import Avg for circuito in Circuito.objects.all(): promedio_fit_circuito = VotoMesa.objects.filter(mesa__circuito=circuito, opcion=Fit).aggregate(Avg('votos'))['votos__avg'] if not promedio_fit_circuito: continue for mesa in Mesa.objects.filter(circuito=circuito, votomesa__votos__gt=0, votomesa__votos__lte=promedio_fit_circuito/2, votomesa__opcion=Fit): display_html(HTML("%s - Total computados: %d, Promedio FIT/circ = %f" % (mesa.url, mesa, mesa.computados, promedio_fit_circuito)))