コード例 #1
0
def fetch_detail(sid):
    index_query = {'mo': 'senadores', 'ac': 'periodos'}
    index = requests.get(urljoin(BASE, '{}{}'.format(
        PATH, helpers.query_parser(index_query))))
    index_soup = BeautifulSoup(index.text, 'html.parser')

    detail_query = {'mo': 'senadores', 'ac': 'fichasenador', 'id': sid}
    detail = requests.get(urljoin(BASE, '{}{}'.format(
        PATH, helpers.query_parser(detail_query))))
    detail_soup = BeautifulSoup(detail.text, 'html.parser')

    datos = detail_soup.find(class_='datos').find_all('strong')
    valid_strong = ['Partido:', 'Teléfono:', 'Mail:', 'Currículum']
    datos = list(
        filter(lambda dato: dato.text in valid_strong or dato.find('a'), datos))

    search_param = re.compile('id={}'.format(sid))
    nombre_completo = index_soup.find('a', href=search_param).text

    partido = datos[0].next_sibling.strip()
    telefono = helpers.process_phone_number(datos[1].next_sibling.strip())
    email = datos[2].next_sibling.strip()
    curriculum_uri = '{}{}'.format(BASE, datos[3].find('a')['href'])
    foto_uri = urljoin(BASE, detail_soup.find(
        'img', class_='foto_imag')['src'])

    return {
        'id': sid,
        'partido_politico': partido,
        'email': email,
        'telefono': telefono,
        'url_curriculum': curriculum_uri,
        'url_foto': foto_uri,
        **helpers.parse_name(nombre_completo)
    }
コード例 #2
0
def fetch_new_comisiones():
    query = {
        'mo': 'tramitacion',
        'ac': 'comisiones',
    }

    main = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query))))
    soup = BeautifulSoup(main.text, 'html.parser')

    data = []
    rows = soup.find_all('tr')[1:-1]
    for row in rows:
        _id, camara, tipo, nombre, _ = row.find_all('td')
        if 'diputados' in camara.text.lower() or 'mixta' in tipo.text.lower():
            continue

        nombre = nombre.text[3:] if 'de ' == nombre.text[:3] else nombre.text
        data.append({
            'id': int(_id.text),
            'tipo': tipo.text.lower(),
            'nombre': nombre
        })

    return data
コード例 #3
0
def fetch_resumen(proyecto):
    query = {
        'mo': 'tramitacion',
        'ac': 'datos_proy',
        'nboletin': proyecto['boletin']
    }

    main = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query))))
    soup = BeautifulSoup(main.text, 'html.parser')

    id_criteria = re.compile('proyid\\s*=\\s*(.*?);')
    proyecto['id'] = int(
        id_criteria.findall(soup.find_all('script')[0].string)[0])

    info_table = soup.find_all('table')[1]

    proyecto['resumen'] = re.sub(
        ' +', ' ',
        info_table.find_all('tr')[0].find_all('td')[1].text.replace(
            '\n', '').strip())

    proyecto[
        'url'] = 'http://www.senado.cl/appsenado/templates/tramitacion/index.php?boletin_ini={}'.format(
            proyecto['boletin'])
コード例 #4
0
def fetch_periodos(ids):
    index_query = {'mo': 'senadores', 'ac': 'periodos'}
    index = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(index_query))))
    index_soup = BeautifulSoup(index.text, 'html.parser')

    database_data = []
    cargos = {'S': 'senador', 'D': 'diputado'}

    for _id in ids:
        helpers.logger('\tsid={}'.format(_id))
        search_param = re.compile('id={}'.format(_id))
        row = index_soup.find('a', href=search_param).find_parent('tr')

        periodos = row.find_all('td')[1].text.strip().split(', ')
        for periodo in periodos:
            cargo, intervalo = periodo.split(': ')
            cargo = cargos[cargo]
            inicio, final = intervalo.split('-')
            database_data.append({
                'sid': _id,
                'cargo': cargo,
                'inicio': int(inicio),
                'final': int(final),
            })

    return database_data
コード例 #5
0
def fetch_last_legislation():
    query = {
        'mo': 'sesionessala',
        'ac': 'asistenciaSenadores',
        'camara': 'S',
        'legiid': 490,
    }

    main = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query))))
    soup = BeautifulSoup(main.text, 'html.parser')

    legislations = []
    for option in soup.find('select').find_all('option'):
        lid = int(option['value'])
        pattern = re.compile(r'^(.*) \((.*) - (.*)\)$')
        number, fecha_i, fecha_t = re.search(pattern, option.text).groups()
        legislations.append({
            'lid': int(lid),
            'number': int(number),
            'fecha_i': fecha_i,
            'fecha_t': fecha_t
        })

    return max(legislations, key=lambda legislation: legislation['number'])
コード例 #6
0
def fetch_table_actuales():
    query = {
        'mo': 'senadores',
        'ac': 'listado'
    }

    main = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query))))
    return BeautifulSoup(main.text, 'html.parser').find(class_='clase_tabla')
コード例 #7
0
def fetch_new_asistencias():
    to_fetch = fetch_last_legislation()
    fecha_inicio = datetime.strptime(to_fetch['fecha_i'],
                                     "%d/%m/%Y").strftime('%Y-%d-%m')
    fecha_fin = datetime.strptime(to_fetch['fecha_t'],
                                  "%d/%m/%Y").strftime('%Y-%d-%m')

    query = {
        'mo': 'sesionessala',
        'ac': 'asistenciaSenadores',
        'camara': 'S',
        'legiid': to_fetch['lid'],
    }

    main = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query))))
    soup = BeautifulSoup(main.text, 'html.parser')

    seccion = soup.find(class_=['seccion2', 'sans'])
    table = seccion.find('table', class_='clase_tabla')
    total_sesiones = int(seccion.find('h2').text.split(':')[1])

    asistencias_ = []
    pointer = table.find('tr')
    pointer = pointer.find_next_sibling()
    while pointer:
        pattern = re.compile(r'.*parlid=(.*)&.*')
        sid = int(re.search(pattern, pointer.find('a')['href']).group(1))

        _, asistencias, inasistencias_just = pointer.find_all('td')

        asistencias = int(asistencias.text.strip())
        if inasistencias_just.text.strip() != '':
            inasistencias_just = int(inasistencias_just.text.strip())
        else:
            inasistencias_just = 0

        inasistencias_no_just = total_sesiones - inasistencias_just - asistencias
        if inasistencias_no_just < 0:
            inasistencias_no_just = 0

        asistencias_.append({
            'lid': to_fetch['lid'],
            'sid': sid,
            'asistencias': asistencias,
            'inasistencias_just': inasistencias_just,
            'inasistencias_no_just': inasistencias_no_just,
            'fecha_inicio': fecha_inicio,
            'fecha_fin': fecha_fin,
        })

        pointer = pointer.find_next_sibling().find_next_sibling()

    return asistencias_
コード例 #8
0
def fetch_integrantes(cid):
    query = {'mo': 'comisiones', 'ac': 'ficha', 'id': cid, 'tipo_comision': 10}

    main = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query))))
    soup = BeautifulSoup(main.text, 'html.parser')

    detalle = soup.find(
        class_=['col1', 'integrantes', 'shadow-down', 'center'])

    integrantes_data = []

    integrantes = detalle.find_all('article')
    for integrante in integrantes:
        parl_img_url = integrante.find('img')['src'].split('?')[1]
        query = helpers.query_parser(parl_img_url)
        integrantes_data.append({
            'cid': cid,
            'sid': int(query['fid']),
        })

    return integrantes_data
コード例 #9
0
def fetch_proyectos_in_comision(cid):
    query = {'mo': 'tramitacion', 'ac': 'boletin_x_fecha', 'comiid': cid}

    main = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query))))
    soup = BeautifulSoup(main.text, 'html.parser')

    boletines = []

    radicados, _, informados, _ = soup.find_all('table')
    for row in radicados.find_all('tr')[1:]:
        _, boletin, _, _, _, _ = row.find_all('td')
        boletines.append(boletin.text)

    for row in informados.find_all('tr')[1:]:
        _, boletin, _, _, _, _ = row.find_all('td')
        boletines.append(boletin.text)

    return set(boletines)
コード例 #10
0
def fetch_autores(pid):
    query = {'mo': 'tramitacion', 'ac': 'autores', 'proyid': pid}

    main = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query))))
    soup = BeautifulSoup(main.text, 'html.parser')

    info_table = soup.find('table')
    autores = []
    for row in info_table.find_all('tr')[1:]:
        info = row.find_all('td')
        sid = info[0].text.strip()
        cargo = info[2].text.strip()

        if cargo != 'S':
            continue

        autores.append({'pid': pid, 'sid': int(sid)})

    return autores
コード例 #11
0
def fetch_detail(comision):
    query = {
        'mo': 'comisiones',
        'ac': 'ficha',
        'id': comision['id'],
        'tipo_comision': 10
    }

    main = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query))))
    soup = BeautifulSoup(main.text, 'html.parser')

    detalle = soup.find(
        class_=['col1', 'integrantes', 'shadow-down', 'center'])

    detalle = detalle.find_next_sibling().find_all('tr')[-2:]
    email = detalle[0].find_all('td')[1].text.strip()
    telefono = detalle[1].find_all('td')[1].text.strip()

    comision['email'] = email if email != '' else None
    comision['telefono'] = helpers.process_phone_number(telefono)
コード例 #12
0
def fetch_new_proyectos(custom_last_date):
    today = datetime.now().date()
    yesterday = (datetime.now() - timedelta(days=1)).date()

    query = {
        'mo':
        'tramitacion',
        'ac':
        'avanzada_resultado',
        'cadena':
        '0~S~1~0~{}~{}~~~0~0~~~~'.format(
            yesterday.strftime('%d/%m/%Y')
            if custom_last_date is None else custom_last_date,
            today.strftime('%d/%m/%Y'),
        )
    }

    main = requests.get(
        urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query))))
    soup = BeautifulSoup(main.text, 'html.parser')

    data = []

    rows = soup.find_all('tr')[1:-1]
    if (len(rows) == 0):
        return data

    for proyecto in rows:
        info = proyecto.find_all('td')
        date = info[0].text.strip()
        boletin = info[1].text.strip()
        estado_raw = info[3].text.strip()

        data.append({
            'fecha': datetime.strptime(date, '%d/%m/%Y'),
            'boletin': boletin,
            'estado': helpers.parse_estado(estado_raw)
        })

    return data