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') 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/') for anchor in pq('a'): url = pq(anchor).attr('href') text = pq(anchor).text() if nivel == 'circuito': # mesa mesa = Mesa.objects.create(numero=text, circuito=parent, url=url) for opcion, votos in parse_telegrama(url).iteritems(): opcion, _ = Opcion.objects.get_or_create(nombre=opcion) VotoMesa.objects.create(mesa=mesa, opcion=opcion, votos=votos) 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) # 024 - Totoral crawl2('http://www.resultados.gob.ar/telegramas/ICIR04024.htm', 'muni') Mesa.objects.all() Opcion.objects.all() Fit = Opcion.objects.get(nombre='FRENTE DE IZQUIERDA Y DE LOS TRABAJADORES') VotoMesa.objects.filter(opcion=Fit).aggregate(Sum('votos')) from IPython.display import display_html, HTML, IFrame for mesa in Mesa.objects.filter(votomesa__votos=0, votomesa__opcion=Fit): display_html(HTML("%s - Total computados: %d" % (mesa.url, mesa, mesa.computados))) IFrame(src=Mesa.objects.get(numero__contains='7634').url, width="100%", height=300) # datos de todo cordoba. Puede tardar crawl2('http://www.resultados.gob.ar/telegramas/IMUN04.htm') Circuito.objects.all().count() from django.db import connections, connection connections.databases ls db.sqlite !nautilus . Mesa.objects.count() for mesa in Mesa.objects.filter(votomesa__votos=0, votomesa__opcion=Fit): display_html(HTML("%s - Total computados: %d" % (mesa.url, mesa, mesa.computados)))