Módulo que contiene clases y funciones para la extracción de datos de la página web del Senado.
Módulo html5lib
Análisis de URLs del Senado sobre iniciativas legislativas. Se indican las URLs directas, prescindiendo de los marcos.
Indice de actividad:
Proyectos de Ley:
El índice de los Proyectos de Ley incluye todos los proyectos habidos hasta la fecha:
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 cada una de las URLs sobre un Proyecto de Ley, se indica la siguiente información:
Publicaciones del Proyecto en el Senado:
Publicaciones en el Congreso:
Publicaciones en las Cortes Generales:
Tramitación:
Votaciones:
Sesiones celebradas en comisión:
Intervenciones:
De esta URL puede obtenerse el control de los agentes normativos.
Datos generales:
Enmiendas:
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:
Parámetros a tomar en consideración:
Publicaciones de las Proposiciones de Ley iniciadas en el Senado:
Publicaciones en el Congreso:
Publicaciones en las Cortes Generales:
Tramitación:
Votaciones:
Sesiones celebradas en comisión:
Intervenciones:
De esta URL puede obtenerse el control de los agentes normativos.
Datos generales:
Enmiendas:
Proposiciones de Ley iniciadas en el Congreso de los Diputados:
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:
En la anterior legislatura existieron las siguientes iniciativas de Proposiciones del Ley iniciadas en el Congreso de los Diputados:
Todo
Enlaces desde las Proposiciones de Ley.
Convenios Internacionales:
Propuestas de reforma de Estatutos de Autonomía:
Senadores
Listado alfabético de senadores de todas las legislaturas:
Listado alfabético de senadores de la novena legislatura:
Comisiones
Permanentes legislativas
Permanentes no legislativas
Mixtas
De investigación
Especiales
Conjuntas
Conjuntas (Senado-Congreso)
Ponencias de estudio
De comisiones del Senado
De comisiones mixtas
Obtiene una lista de diccionarios de todos los grupos parlamentarios.
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
Obtiene una lista de diccionarios de grupos parlamentarios de una legislatura.
Función para obtener la lista de iniciativas existentes en el Senado. Son obligatorias las siguientes variables:
Uso:
>>> get_senado_actividad(URL_LEGISLATURA[8], URL_INICIATIVA[0][1])
Devuelve:
Una lista con las iniciativas.
Función para obtener datos de la lista de actividades.
Uso:
Todo
Devuelve:
Todo
Extrae de una legislatura el nombre de la circunscripción electoral y sus senadores.
Devuelve un diccionario.
Uso
>>> senadores = get_senador_circunscripcion(1, '48')
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.
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.
# -*- 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