Módulo que contiene clases y funciones para extraer y tratar texto de las páginas web del Congreso de los Diputados
Todo
docstring incompleto
Todo
Revisar dependencias
Todo
Revisar uso
Las iniciativas a seguir son las siguientes:
Deben definirse los agentes del sistema en varios niveles de catalogación:
Función que filtra los datos de las páginas de índices de proyectos y proposiciones de ley
Extrae los urls de una lista de webs.
Uso:
>>> extract_url(homepage)
Descarga una página web y crea una instancia de la clase soup.
Uso:
>>> homepage = get_soup('http://derecho-internet.org')
Devuelve una instancia de la clase soup.
# -*- coding: utf-8 -*-
"""
=========================================================================================
:mod:`scrapers.es_congreso` - Extracción de datos de la web del Congreso de los Diputados
=========================================================================================
Módulo que contiene clases y funciones para extraer y tratar texto de
las páginas web del Congreso de los Diputados
.. todo::
docstring incompleto
Dependencias
------------
* Módulo BeautifulSoup
* Módulo datetime
* Módulo re
* Módulo urllib2
.. todo::
Revisar dependencias
Uso:
----
.. todo::
Revisar uso
Iniciativas a seguir
--------------------
Las iniciativas a seguir son las siguientes:
- Proyectos de Ley
- Proposiciones de Ley
.. todo
Revisar las iniciativas a seguir
Agentes
-------
Deben definirse los agentes del sistema en varios niveles de
catalogación:
- Individual
- Organización administrativa de la cámara.
- Organización política de la cámara.
- Organización de trabajo legislativo.
"""
__author__ = 'Javier de la Cueva'
__copyright__ = 'Javier de la Cueva'
__license__ = "GNU AGPLv3"
__url__ = 'http://derecho-internet/proyectos/kelsen'
__version__ = '$Revision: 321 $'
import urllib2
import re
from datetime import datetime
from BeautifulSoup import BeautifulSoup
# Cadenas para construir urls
URL_BASE_CONGRESO = 'http://www.congreso.es/'
URL_MEDIA_CONGRESO = 'portal/page/portal/Congreso/Congreso/'
URL_PROYECTOS = URL_BASE_CONGRESO + 'Iniciativas/ProydeLey?_piref73_1335538_73_1335535_1335535.next_page=/wc/servidorCGI&CMD=VERLST&BASE=IWI9&FMT=INITXLBA.fmt&DOCS=1-25&DOCORDER=FIFO&DES1=Proyectos+de+Ley+en+tramitaci%F3n&QUERY=121.cini.+no+@fcie+no+concluido.fase.'
URL_PROPOSICIONES = URL_BASE_CONGRESO + 'Iniciativas/PropLey?_piref73_1335476_73_1335473_1335473.next_page=/wc/servidorCGI&CMD=VERLST&BASE=IWI9&FMT=INITXLBA.fmt&DOCS=1-25&DOCORDER=FIFO&DES1=Proposiciones+de+Ley&QUERY=(proposicion+adj2+ley).tipo.'
URL_TODAS_INICIATIVAS = URL_BASE_CONGRESO + URL_MEDIA_CONGRESO + 'Iniciativas/Indice%20de%20Iniciativas'
URL_DIPUTADOS = URL_BASE_CONGRESO + 'Diputados'
# En la url de cada diputado hay dos parámetros: idDiputado=368 e idLegislatura=9
# TODO función para extraer los datos
## Cadenas para boletines
# Boletín del pleno
'http://www.congreso.es/public_oficiales/L9/CONG/DS/PL/'
# Serie A: Proyectos de ley
'http://www.congreso.es/public_oficiales/L9/CONG/BOCG/A/'
# Serie B: Proposiciones de ley
'http://www.congreso.es/public_oficiales/L9/CONG/BOCG/B/'
# Serie D: General
'http://www.congreso.es/public_oficiales/L9/CONG/BOCG/D/'
# Funciones auxiliares
def get_soup(url):
"""
Descarga una página web y crea una instancia de la clase soup.
Uso:
>>> homepage = get_soup('http://derecho-internet.org')
Devuelve una instancia de la clase soup.
"""
# TODO: Crear excepción si no hay conexión.
# Si no se utiliza urllib2 y se declara el agente, da excepción
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
sock = opener.open(url)
soup = BeautifulSoup(sock)
sock.close()
return soup
def get_grupos_iniciativas(url=URL_TODAS_INICIATIVAS):
soup = get_soup(url)
now = datetime.now()
elementos = soup.findAll('li')[17:]
lista = []
for elemento in elementos:
diccionario = {}
diccionario['grupo_iniciativa'] = elemento.a.string
diccionario['url'] = URL_BASE_CONGRESO + elemento.a.attrs[0][1][1:]
diccionario['cantidad'] = int(elemento.span.string.strip('()'))
diccionario['update'] = now
lista.append(diccionario)
return lista
def get_iniciativas_por_grupo(url):
soup = get_soup(url)
elementos = soup.findAll('p', {'class': 'titulo_iniciativa'})
lista = []
for elemento in elementos:
diccionario = {}
diccionario['iniciativa'] = elemento.a.string
diccionario['url'] = URL_BASE_CONGRESO + elemento.a.attrs[0][1][1:]
lista.append(diccionario)
return lista
def get_iniciativa(url):
soup = get_soup(url)
diccionario = {}
iniciativa = soup.findAll('p', {'class': 'titulo_iniciativa'})[0].string
diccionario['iniciativa'] = iniciativa.split('(')[0].strip(')').rstrip()
diccionario['expediente'] = iniciativa.split('(')[1].strip(')')
diccionario['url'] = url
return diccionario
def build_metadata_soup(soup):
"""
Función que filtra los datos de las páginas de índices de proyectos y proposiciones
de ley
"""
lista = []
resultado_set = soup.findAll('div', {'class': 'resultados_encontrados'})
for resultado in resultado_set:
diccionario = {}
titulo = diccionario[u'titulo'] = resultado.contents[1].findChild().string
url = diccionario[u'url'] = URL_BASE_CONGRESO + resultado.findAll('a')[0].attrs[0][1][1:]
lista.append(diccionario)
return lista
def extract_url(lista_metadata):
"""
Extrae los urls de una lista de webs.
Uso:
>>> extract_url(homepage)
"""
lista = []
for item in lista_metadata:
url = item['url']
lista.append(url)
return lista
# TODO: Clase IniciativaParlamentaria
# TODO: Control de Iniciativas por parlamentario
# TODO: Control de Comisiones
## To be continued ...