Detectar con python cambios (Modificaciones, Adiciones o Retiro) de Leyes Federales en México

Detectar con python cambios (Modificaciones, Adiciones o Retiro) de Leyes Federales en México

mario.hernandez 23 October 2021

"O un mundo ordenado,

o una mezcla confusa muy revuelta, pero sin orden.

¿Es posible que exista en ti cierto orden y,

en cambio, en el todo desorden?"

Marco Aurelio

 

Hace tiempo escribí como representar las leyes federales mexicanas en una cadena JSON a fin de poder manipularlas, sin embargo, ahora ha cambiado un poco la estructura de la pag web de la pág de la Cámara de Diputados, por lo que he actualizado el código (y mantengo la misma estructura JSON) con la libreria Beautiful Soup de python por dos razones: 1. Es más robusto a una posible reestructura de la pág de los diputados; 2. Vuelve más legible el Código.

La función que lo realiza Leyes a JSON:

import json
import requests
from bs4 import BeautifulSoup as bs


def get_leyes_diputados():
    '''Obtiene las leyes publicadas en la pagina de leyes de los diputados'''
    leyes_federales = {}
    articulos = ['en', 'y', 'lo', 'los', 'la', 'las',
                'por', 'para', 'se', 'o', 'a', 'de',
                'del', 'que', 'el', 'al', 'su']

    vocales_con = ['Á', 'á', 'É', 'é', 'Í', 'í', 'Ó', 'ó', 'Ú', 'ú', 'Ñ', 'ñ', '.']
    vocales_sin = ['A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u', 'N', 'n', '']

    r = requests.get('http://www.diputados.gob.mx/LeyesBiblio/index.htm')
    text = r.text.replace('\n','').replace('\t', '')
    soup = bs(text)

    tables = soup.findAll('table')
    for table in tables:
        trs = table.findAll('tr')
        for tr in trs:
            tds = tr.findAll('td')
            for td in tds:
                elements_a = td.findAll('a')
                if len(elements_a) == 1:  # Nombre de ley y link a pag web
                    name_ley = elements_a[0].findAll('font')
                    name_ley = ''.join([ x.text for x in name_ley ]).title()

                    nl = name_ley.split('(')[0].split(',')[0].split()
                    
                    iniciales = [ palabra[0] for palabra in nl[:-1] if palabra.lower() not in articulos ]
                    iniciales = ''.join(iniciales) + nl[-1][:3]
                    
                    for letra in iniciales:
                        for con, sin in zip(vocales_con, vocales_sin):
                            iniciales = iniciales.replace(con, sin)
                    
                    if leyes_federales.get(iniciales): iniciales += '2'  # Cuando coiciden iniciales de 2 leyes

                    leyes_federales[iniciales] = {}
                    leyes_federales[iniciales]['name'] = name_ley.replace('(', '\(').replace(')', '\)')
                    leyes_federales[iniciales]['ref'] = elements_a[0]['href']
                
                elif len(elements_a) == 3:  # links PDF DOC y PDF_MOV
                    leyes_federales[iniciales]['pdf'] = elements_a[0]['href']
                    leyes_federales[iniciales]['doc'] = elements_a[1]['href']
                    leyes_federales[iniciales]['pdf_mov'] = elements_a[2]['href']

    return leyes_federales

Pueden existir 3 escenarios con las leyes:

  1. Adición;
  2. Eliminación;
  3. Modificación.

Lo podemos realizar con lo siguiente (Tomen en cuenta que deben tener un archivo previo _leyes_federales.json, el cual servirá para realizar la comparación. Si no tienen el archivo, crear un archivo con un JSON vacío {} y ejecutar el script: todas seran "leyes_nuevas".

with open('_leyes_federales.json') as f:  # Leyes actuales para comparar
    leyes_a_actualizar = json.load(f)

check_updates_leyes = get_leyes_diputados()

leyes_nuevas = [ ley for ley in check_updates_leyes if not leyes_a_actualizar.get(ley) ]
leyes_eliminadas = [ ley for ley in leyes_a_actualizar if not check_updates_leyes.get(ley) ]
leyes_modificadas = [ ley for ley in check_updates_leyes 
                      if check_updates_leyes.get(ley) != leyes_a_actualizar.get(ley) 
                        and ley not in leyes_nuevas + leyes_eliminadas ]

print(f'LEYES NUEVAS --> {leyes_nuevas}')
print(f'LEYES ELIMINADAS --> {leyes_eliminadas}')
print(f'LEYES MODIFICADAS --> {leyes_modificadas}')

Finalmente, solo para precisar, la actualización de la ley es con respecto a la cámara de Diputados y no cuando es publicada en el DOF (Diario Oficial de la Federación)

Mario Hernández

@armiok