Senado

scrapers.es_senado - Extracción de datos de la página web del Senado

Módulo que contiene clases y funciones para la extracción de datos de la página web del Senado.

Dependencias

Módulo html5lib

Uso

Iniciativas legislativas

Análisis de URLs del Senado sobre iniciativas legislativas. Se indican las URLs directas, prescindiendo de los marcos.

Agentes

get_all_pg(url_list=('http://www.senado.es/solotexto/legis0/grupos/lista_grupos.html', 'http://www.senado.es/solotexto/legis1/grupos/lista_grupos.html', 'http://www.senado.es/solotexto/legis2/grupos/lista_grupos.html', 'http://www.senado.es/solotexto/legis3/grupos/lista_grupos.html', 'http://www.senado.es/solotexto/legis4/grupos/lista_grupos.html', 'http://www.senado.es/solotexto/legis5/grupos/lista_grupos.html', 'http://www.senado.es/solotexto/legis6/grupos/lista_grupos.html', 'http://www.senado.es/solotexto/legis7/grupos/lista_grupos.html', 'http://www.senado.es/solotexto/legis8/grupos/lista_grupos.html'))

Obtiene una lista de diccionarios de todos los grupos parlamentarios.

get_mp(url)

Función para obtener la ficha personal de cada senador.

Uso:

>>> url = 'http://www.senado.es/senadores/10802/ficha.html'
>>> senador = get_mp(url)

Devuelve un diccionario.

Todo

  • Split de apellidos en apellido1 y apellido2
  • Grupo parlamentario
  • Partido político
get_pg(url)

Obtiene una lista de diccionarios de grupos parlamentarios de una legislatura.

get_senado_actividad(legislatura, iniciativa)

Función para obtener la lista de iniciativas existentes en el Senado. Son obligatorias las siguientes variables:

  • legislatura.
  • inciativa.

Uso:

>>> get_senado_actividad(URL_LEGISLATURA[8], URL_INICIATIVA[0][1])

Devuelve:

Una lista con las iniciativas.

get_senado_iniciativa_data(lista_actividades)

Función para obtener datos de la lista de actividades.

Uso:

Todo

Devuelve:

Todo

get_senador_circunscripcion(num_legislatura, circunscripcion)

Extrae de una legislatura el nombre de la circunscripción electoral y sus senadores.

Devuelve un diccionario.

Uso

>>> senadores = get_senador_circunscripcion(1, '48')
get_senadores_numeros(url='http://www.senado.es/senadores//alfabet.html')

Función para obtener el número de todos los senadores desde el Senado constituyente hasta la fecha.

Uso:

>>> numeros = get_senadores_numeros()

Devuelve:

Una lista. Cada elemento es el número asignado a cada senador.

get_senadores_url(url='http://www.senado.es/senadores//alfabet.html')

Función para obtener la url de la páginas web del Senado de todos los senadores desde el Senado constituyente hasta la fecha.

Uso:

>>> urls = get_senadores_urls()

Devuelve:

Una lista. Cada elemento es la url de la página de cada senador.

senadores_por_grupo(url)
# -*- coding: utf-8 -*-
"""
===========================================================================
:mod:`scrapers.es_senado` - Extracción de datos de la página web del Senado
===========================================================================

Módulo que contiene clases y funciones para la extracción de datos de
la página web del Senado.

Dependencias
------------

Módulo :mod:`html5lib`

Uso
---

Iniciativas legislativas
------------------------

Análisis de URLs del Senado sobre iniciativas legislativas. Se indican
las URLs directas, prescindiendo de los marcos.

- Indice de actividad:

   http://www.senado.es/legis9/actividad/actividad.html

- Proyectos de Ley:

  El índice de los Proyectos de Ley incluye todos los proyectos
  habidos hasta la fecha:

   http://www.senado.es/legis9/expedientes/proy_todos.html

  Los parámetros a tener en cuenta para la extracción de datos
  presentan las características que podemos deducir de la primera y
  última de las URLs:
  
   De: http://www.senado.es/legis9/expedientes/621/index_621000001.html

   Hasta: http://www.senado.es/legis9/expedientes/621/index_621000009.html

  De cada una de las URLs sobre un Proyecto de Ley, se indica la
  siguiente información:
  
  - Publicaciones del Proyecto en el Senado:

     http://www.senado.es/legis9/expedientes/621/senado/621000009.html

  - Publicaciones en el Congreso:

     http://www.senado.es/legis9/expedientes/621/congreso/621000009.html

  - Publicaciones en las Cortes Generales:

     http://www.senado.es/legis9/expedientes/621/cortes/621000009.html

  - Tramitación:

     http://www.senado.es/legis9/expedientes/621/tramitacion/621000009.html

  - Votaciones:

     http://www.senado.es/legis9/expedientes/621/votaciones/621000009.html

  - Sesiones celebradas en comisión:

     http://www.senado.es/legis9/expedientes/621/sesiones/621000009.html

  - Intervenciones:

    De esta URL puede obtenerse el control de los agentes normativos.
    
     http://www.senado.es/legis9/expedientes/621/intervenciones/621000009.html

  - Datos generales:

     http://www.senado.es/legis9/expedientes/621/general/621000009.html

  - Enmiendas:

     http://www.senado.es/cgi-bin/cgiopcenm9?621&000009

- Proposiciones de Ley iniciadas en el Senado:

  Las Proposiciones de Ley siguen igual estructura de publicación en
  la web que los Proyectos de Ley, manteniéndose con igual sistema en
  las demás iniciativas del Senado.

  Indice de las Proposiciones:

   http://www.senado.es/legis9/expedientes/propo_senado.html

  Parámetros a tomar en consideración:

   De: http://www.senado.es/legis9/expedientes/622/index_622000001.html

   Hasta: http://www.senado.es/legis9/expedientes/622/index_622000007.html

  - Publicaciones de las Proposiciones de Ley iniciadas en el Senado:

     http://www.senado.es/legis9/expedientes/622/senado/622000007.html

  - Publicaciones en el Congreso:

     http://www.senado.es/legis9/expedientes/622/congreso/622000007.html

  - Publicaciones en las Cortes Generales:

     http://www.senado.es/legis9/expedientes/622/cortes/622000007.html

  - Tramitación:

     http://www.senado.es/legis9/expedientes/622/tramitacion/622000007.html

  - Votaciones:

     http://www.senado.es/legis9/expedientes/622/votaciones/622000007.html

  - Sesiones celebradas en comisión:

     http://www.senado.es/legis9/expedientes/622/sesiones/622000007.html

  - Intervenciones:

    De esta URL puede obtenerse el control de los agentes normativos.
    
     http://www.senado.es/legis9/expedientes/622/intervenciones/622000007.html

  - Datos generales:

     http://www.senado.es/legis9/expedientes/622/general/622000007.html

  - Enmiendas:

     http://www.senado.es/cgi-bin/cgiopcenm9?622&000007  

- Proposiciones de Ley iniciadas en el Congreso de los Diputados:

   http://www.senado.es/legis9/expedientes/propo_congreso.html

  En la fecha de escritura del presente documento no existe ninguna
  inciativa de este tipo. Sin embargo, podemos acceder a las de la
  legislatura anterior mediante la siguiente URL:

   http://www.senado.es/legis8/expedientes/propo_congreso.html

  En la anterior legislatura existieron las siguientes iniciativas de
  Proposiciones del Ley iniciadas en el Congreso de los Diputados:

   De: http://www.senado.es/legis8/expedientes/624/index_624000001.html

   Hasta: http://www.senado.es/legis8/expedientes/624/index_624000019.html

   Y de: http://www.senado.es/legis8/expedientes/625/index_625000001.html

   Hasta: http://www.senado.es/legis8/expedientes/625/index_625000002.html

  .. todo:: Enlaces desde las Proposiciones de Ley.
  
- Convenios Internacionales:

   http://www.senado.es/legis9/expedientes/conv_todos.html

   De: http://www.senado.es/legis9/expedientes/610/index_610000001.html

   Hasta: http://www.senado.es/legis9/expedientes/610/index_610000060.html

- Propuestas de reforma de Estatutos de Autonomía:

   http://www.senado.es/legis9/expedientes/estccaa_todos.html

Agentes
-------

- Senadores

  Listado alfabético de senadores de todas las legislaturas:

   http://www.senado.es/senadores/alfabet.html

  Listado alfabético de senadores de la novena legislatura:
  
   http://www.senado.es/legis9/senadores/alfabet.html

- Comisiones

  Permanentes legislativas
   
   http://www.senado.es/legis9/comisiones/perlegis.html
   
  Permanentes no legislativas

   http://www.senado.es/legis9/comisiones/pernlegis.html

  Mixtas

   http://www.senado.es/legis9/comisiones/pmixtas.html

  De investigación

   http://www.senado.es/legis9/comisiones/pinvestiga.html

  Especiales

   http://www.senado.es/legis9/comisiones/pespecial.html

  Conjuntas

   http://www.senado.es/legis9/comisiones/pconjunta.html

  Conjuntas (Senado-Congreso)

   http://www.senado.es/legis9/comisiones/pconjsencon.html

- Ponencias de estudio

  De comisiones del Senado

   http://www.senado.es/legis9/ponencias/ponencias.html

  De comisiones mixtas

   http://www.senado.es/legis9/ponencias/ponmix.html

"""

__author__ = 'Javier de la Cueva'
__copyright__ = 'Javier de la Cueva'
__license__ = "GNU AGPLv3"
__url__ = 'http://derecho-internet/proyectos/kelsen'
__version__ = '$Revision: 523 $'


import re
from urlparse import urlparse
from datetime import date

from django.template.defaultfilters import slugify

from scrapers.common import get_soup, get_tree, meses
from utils.slughifi import slughifi




# Cadenas para construir urls

URL_BASE = 'http://www.senado.es/'

URL_LEGISLATURA = ('legis0/', 'legis1/', 'legis2/', 'legis3/', 'legis4/',
                   'legis5/', 'legis6/', 'legis7/', 'legis8/', 'legis9/')

URLS_PG_LEGISLATURAS = (
    URL_BASE + 'solotexto/legis0/grupos/lista_grupos.html',
    URL_BASE + 'solotexto/legis1/grupos/lista_grupos.html',
    URL_BASE + 'solotexto/legis2/grupos/lista_grupos.html',
    URL_BASE + 'solotexto/legis3/grupos/lista_grupos.html',
    URL_BASE + 'solotexto/legis4/grupos/lista_grupos.html',
    URL_BASE + 'solotexto/legis5/grupos/lista_grupos.html',
    URL_BASE + 'solotexto/legis6/grupos/lista_grupos.html',
    URL_BASE + 'solotexto/legis7/grupos/lista_grupos.html',
    URL_BASE + 'solotexto/legis8/grupos/lista_grupos.html',
    )

legislaturas = range(0,10)

URL_INICIATIVA = (
    ('Proyectos de ley', 'expedientes/proy_todos.html'),
    ('Proposiciones de ley iniciadas en el Congreso', 'expedientes/propo_congreso.html'),
    ('Proposiciones de ley iniciadas en el Senado', 'expedientes/propo_senado.html'),
    ('Convenios internacionales', 'expedientes/conv_todos.html'),
    ('Reforma de estatutos de CCAA', 'expedientes/estccaa_todos.html'),
    )

URL_SENADORES = URL_BASE + 'senadores/'
#URL_GRUPOS = URL_BASE + '/solotexto/' + URL_LEGISLATURA + '/grupos/lista_grupos.html'

# Funciones auxiliares

def get_senado_actividad(legislatura, iniciativa):
    """
    Función para obtener la lista de iniciativas existentes en el
    Senado. Son obligatorias las siguientes variables:

    - legislatura.
    - inciativa.
    
    Uso:

        >>> get_senado_actividad(URL_LEGISLATURA[8], URL_INICIATIVA[0][1])

    Devuelve:

    Una lista con las iniciativas.
    
    """
    lista = []
    url = URL_BASE + legislatura + iniciativa
    soup = get_soup(url)
    elementos = soup.findAll('li')
    for elemento in elementos:
        nombre = elemento.a.next
        url_norma = elemento.a.attrs[0][1].split('(')[1][2:-2]
        url_norma = URL_BASE + url_norma
        diccionario = dict(iniciativa=nombre, url=url_norma)
        lista.append(diccionario)
    return lista

def get_senado_iniciativa_data(lista_actividades):
    """
    Función para obtener datos de la lista de actividades.

    Uso:

    .. todo::

    Devuelve:

    .. todo::
    
    """
    for actividad in lista_actividades:
        soup = get_soup(actividad['url'])
        expediente = soup.head.title.string.strip().split()[1]
        # TODO:
        # 

# Extracción proposiciones de ley iniciadas Congreso

# Extracción proposiciones de ley iniciadas Senado

# Extracción de legisladores

## Senadores

def get_senadores_url(url=URL_SENADORES+'/alfabet.html'):
    """
    Función para obtener la url de la páginas web del Senado de todos
    los senadores desde el Senado constituyente hasta la fecha.

    Uso:

    >>> urls = get_senadores_urls()

    Devuelve:

    Una lista. Cada elemento es la url de la página de cada senador.
    
    """
    tree = get_tree(url)
    listado_urls = []
    elementos = tree.findAll('li')
    for elemento in elementos:
        url = elemento.a.attrs[0][1].split("'")[1][1:]
        url = url.replace('index', 'ficha')
        listado_urls.append(URL_BASE+url)
    return listado_urls

def get_senadores_numeros(url=URL_SENADORES+'/alfabet.html'):
    """
    Función para obtener el número de todos los senadores desde el
    Senado constituyente hasta la fecha.

    Uso:

    >>> numeros = get_senadores_numeros()

    Devuelve:

    Una lista. Cada elemento es el número asignado a cada senador.
    
    """
    tree = get_tree(url)
    lista = list()
    elementos = tree.findAll('li')
    for elemento in elementos:
        numero = elemento.a.attrs[0][1].split('/')[2]
        lista.append(numero)
    return lista

def get_mp(url):
    """
    Función para obtener la ficha personal de cada senador.

    Uso:

    >>> url = 'http://www.senado.es/senadores/10802/ficha.html'
    >>> senador = get_mp(url)

    Devuelve un diccionario.

    .. todo::

    - Split de apellidos en apellido1 y apellido2
    - Grupo parlamentario
    - Partido político

    """
    tree = get_tree(url)
    mp = dict()
    mp['name'] = tree.title.decodeContents().split(',')[1].strip()
    mp['surname'] = tree.title.decodeContents().split(',')[0]
    tags_li = tree.findAll('li')
    date_birth = tags_li[0].next.next.next.next.strip()[3:-1]
    d, m, y = date_birth.split('de')
    d = int(d.strip())
    m = meses[m.strip().lower()]
    y = int(y.strip())
    mp['date_birth'] = date(y, m, d)
    mp['place_birth'] = tags_li[0].next.next.contents[0]
    mp['marital_status'] = tags_li[1].contents[0].strip()[:-1].split('.')[0]
    try:
        children = tags_li[1].contents[0].strip()[:-1].split('.')[1].strip()
    except IndexError:
        children = 'Sin información'          
    mp['children'] = children
    mp['url_img'] = ''
    mp['studies'] = ''
    mp['job'] = tags_li[2].next
    mp['email'] = 'No consta'
    mp['url_parliament'] = url
    mp['url_blog'] = 'Este dato no consta en la web'
    mp['constituency'] = ''
    numero = urlparse(url).path.split('/')[2]
    mp['numero'] = int(numero)
    legislaturas = tree.findAll('b')
    mp['terms'] = [item.decodeContents() for item in legislaturas]
    mp['group'] = ''
    mp['party'] = ''
    return mp

def get_senador_circunscripcion(num_legislatura, circunscripcion):
    """
    Extrae de una legislatura el nombre de la circunscripción
    electoral y sus senadores.

    Devuelve un diccionario.

    Uso

    >>> senadores = get_senador_circunscripcion(1, '48')
    
    """
    url = URL_BASE+URL_LEGISLATURA[num_legislatura] + \
          'circuns/' + circunscripcion + '.html'
    tree = parser.parse(urllib2.urlopen(url).read())
    circunscripcion = dict()
    circunscripcion['url'] = url
    tags_li = tree.findAll('li')
    numeros = [item.a.attrs[0][1].split('/')[2] for item in tags_li]
    numeros = [int(item) for item in numeros]
    circunscripcion['nombre'] = tree.find('i').next.split(' por ')[1].strip()
    circunscripcion['numeros'] = numeros
    return circunscripcion

# Grupos parlamentarios

def get_pg(url):
    """
    Obtiene una lista de diccionarios de grupos parlamentarios de una
    legislatura.
    """
    tree = get_tree(url)
    lista = list()
    tags_li = tree.findAll('li')
    for item in tags_li:
        pg = dict()
        pg['parliament'] = 'Senado'
        term = tree.find('b').next
        if term == 'CONST. LEGISLATURA':
            term = 'Constituyente'
        else:
            term = term.split()[0]
        pg['term'] = term
        nombre = item.b.a.next
        nombre = nombre.title().replace('Grupo Parlamentario ', '')
        pg['name'] = nombre.title()
        url_page = item.a.attrs[0][1]
        url_pg = url.replace('lista_grupos.html', url_page)
        pg['url'] = url_pg
        pre_slug = pg['term'] + " senado " + pg['name']
        pg['slug'] = slugify(pre_slug)
        lista.append(pg)
    return lista

def get_all_pg(url_list=URLS_PG_LEGISLATURAS):
    """
    Obtiene una lista de diccionarios de todos los grupos
    parlamentarios.
    """
    lista = list()
    for url in url_list:
        ppgg = get_pg(url)
        lista.extend(ppgg)
    return lista

def senadores_por_grupo(url):
    tree = get_tree(url)
    lista = list()
    tags_dt = tree.findAll('dt')
    for item in tags_dt:
        senador = dict()
        senador['parlamento'] = 'Senado'
        senador['legislatura'] = tree.find('b').next
        senador['grupo'] = tree.find('b').next.next.next.next.contents[0]
        senador['numero'] = item.a.attrs[0][1].split('/')[3]
        lista.append(senador)
    return lista


## Comisiones

## Ponencias