In [1]:
import urllib2
#from xml.etree import ElementTree as ET
from lxml import etree as ET #Supports xpath syntax
import xml.etree.ElementTree as ETree
import xml.dom.minidom
from BeautifulSoup import BeautifulSoup
import os
import sys
from collections import defaultdict
from pprint import pprint
Primeiramente prescisamos definir os tipos de proposição existentes na Câmara dos Deputados, para isso a Câmara disponibiliza um XML com tal informação.
In [2]:
xml_page = urllib2.urlopen('http://www.camara.gov.br/SitCamaraWS/Proposicoes.asmx/ListarSiglasTipoProposicao')
str_page = xml_page.read()
root_listagem = ETree.fromstring(str_page)
In [3]:
print str_page
Como podemos ver na visualização do XML acima, o arquivo possui um elemento definido como "sigla" e este elemento possui informações da respectiva sigla, estas informações são dadas a partir de 'keys' arguments, sendo estes:
tipoSigla = apreviação da sigla descricao = descrição da sigla ativa = indica se a sigla está ou não em uso (TRUE or FALSE) genero = Indicador do gênero da sigla da proposição (espécie da proposição)
Agora será montado um dicionário com tais informações
In [4]:
chaves = root_listagem[0].keys()
dicionario_siglas = {'tipoSigla':[],'ativa':[],'genero':[],'descricao':[]}
for i in range(len(root_listagem)):
for k in chaves:
dicionario_siglas[k].append(root_listagem[i].get(k).strip())
In [5]:
dicionario_siglas
Out[5]:
A função descrita abaixo é uma query criada para captação da listagem de proposições sendo os parâmetros de entrada:
sgl = Sigla da proposição buscada
num = Número da proposição (este parâmetro não precisa ser preenchido caso seja uma captura geral de proposições)
year = Ano da proposição
datIni = Inicio do período pesquisado (respeitando o parâmetro year) com formato DD/MM/AAAA
datFinal = Final do período pesquisado (respeitando o parâmetro year) com formato DD/MM/AAAA
Para maiores informações sobre os parâmetros de entrada e saída desta consulta acessar: http://www2.camara.leg.br/transparencia/dados-abertos/dados-abertos-legislativo/webservices/proposicoes-1/listarproposicoes
In [6]:
def query_lista_prop(sgl=str(),num=str(),year=str(),datIni=str(),datFim=str()):
consulta_lista_proposicoes = "http://www.camara.gov.br/SitCamaraWS/Proposicoes.asmx/ListarProposicoes?sigla={sgl}&numero={num}&ano={year}&datApresentacaoIni={datIni}&datApresentacaoFim={datFim}&parteNomeAutor=&idTipoAutor=&siglaPartidoAutor=&siglaUFAutor=&generoAutor=&codEstado=&codOrgaoEstado=&emTramitacao=".format(sgl=sgl,num=num,year=year,datIni=datIni,datFim=datFim)
return consulta_lista_proposicoes
In [7]:
query_lista_prop('PL','','2013','01/01/2013','31/12/2013')
Out[7]:
In [8]:
BASE_URL = query_lista_prop('PL','','2013','06/01/2013','31/12/2013')
In [9]:
xml_page = urllib2.urlopen(BASE_URL)
str_page = xml_page.read()
root = ETree.fromstring(str_page)
In [10]:
len(root.findall('proposicao'))
Out[10]:
In [11]:
root[0].getchildren()
Out[11]:
Os elementos de uma árvore podem possuir outros elementos abaixo, neste caso, basta adicionar uma nova dimensão de busca por índice como feito abaixo, onde a primeira dimensão representa o nó "proposicao" a segunda dimensão representa o nó "proposicao/apreciacao" e a terceira dimensão representa o nó "proposicao/apreciacao/txtApreciacao".
Para descobrir se existem nós dentro de outros nós podemos utilizar a função getchildren() em elementos já obtidos através da mesma função, a seguir uma exemplificação
In [12]:
root[0][2].getchildren() #Aplicando getchildren no elemento 'tipoProposicao', onde são identificados outros nós
Out[12]:
O código a seguir extrai elementos textuais contidos em um nó
In [13]:
root[0][10][1].text
Out[13]:
Estamos interessados em 3 informações para uma busca mais detalhada da proposição no banco de dados "ObterProposicao", com isso precisamos definir um dicionário que contém: Tipo,Número,ano. Abaixo será definida uma função para captura de tais informações.
Como podemos observar na exploração realizada anteriormente, estes dados encontram-se como "filhos" do nó "proposicao", abaixo é apresentado uma proposta para armazenar tais dados.
In [14]:
test = {'Tipo':['PL','MP','PL'],'Numero':[12,34,56],'Ano':[2013,2013,2011]}
In [15]:
test
Out[15]:
In [16]:
test['Ano']
Out[16]:
In [17]:
def input_ObterProposicao(root):
dicionario = {'Tipo':[],'Numero':[],'Ano':[]}
for i in range(len(root)):
dicionario['Tipo'].append(root[i][2][1].text)
dicionario['Numero'].append(root[i][3].text)
dicionario['Ano'].append(root[i][4].text)
return dicionario
In [18]:
test = input_ObterProposicao(root)
In [19]:
test['Tipo'][0:10]
Out[19]:
In [20]:
test['Numero'][0:10]
Out[20]:
In [21]:
test['Ano'][0:10]
Out[21]:
In [21]:
Dado que temos uma listagem de proposições, podemos utilizar este banco para buscar novas informações sobre uma dada proposição. Estas informações estão disponíveis no banco ObterProposicao.
Neste estudo estaremos buscando as seguintes informações:
Autor: Nome do autor da proposição
Tema: Tema da proposição
apensadas: Proposições com assuntos semelhantes.
Indexação: Indexação (palavras-chave) associada à proposição
Além destas informações, também estamos interessados no posicionamento dos Deputados quanto a esta proposição, para isso será acessado o banco de dados da votação de cada proposição, indicado o o Deputado, o voto, a unidade da federação ao qual o deputado representa e a sigla do partido do deputado, estas informações estão disponíveis no banco. Para isso serão criadas querys e dicionários que receberão tais informações.
In [22]:
def query_obterProposicao(typ=str(),number=str(),year=str()):
consulta = 'http://www.camara.gov.br/SitCamaraWS/Proposicoes.asmx/ObterProposicao?tipo={typ}&numero={number}&ano={year}'.format(typ=typ,number=number,year=year)
return consulta
Para fins de teste, utilizaremos dados a partir do dicionário criado a partir dos dados de ListarProposicao
In [50]:
BASE_URL2 = query_obterProposicao(test['Tipo'][2],test['Numero'][2],test['Ano'][1])
In [51]:
BASE_URL2
Out[51]:
In [52]:
xml_page2 = urllib2.urlopen(BASE_URL2)
str_page2 = xml_page2.read()
root2 = ETree.fromstring(str_page2)
In [53]:
print str_page2
In [28]:
root2.getchildren()
Out[28]:
Posição 8 = Autor Posição 13 = Indexacao Posição 16 = apensadas
In [93]:
def informacoes_Proposicao(root2):
dicionario = {'Numero':[],'Tipo':[],'Ano':[],'Autor':[],'Tema':[],'Indexacao':[],'Apensadas':[]}
dicionario['Numero'].append(root2.get('numero'))
dicionario['Tipo'].append(root2.get('tipo').strip())
dicionario['Ano'].append(root2.get('ano'))
dicionario['Tema'].append(root2[5].text)
dicionario['Autor'].append(root2[8].text)
dicionario['Indexacao'].append(root2[13].text.split())
dicionario['Apensadas'].append(root2[16].text)
dicionario['Indexacao'] = dicionario['Indexacao'][0]
return dicionario
In [94]:
teste2 = informacoes_Proposicao(root2)
In [95]:
teste2
Out[95]:
In [92]:
root2[5].text
Out[92]:
In [66]:
teste2['Indexacao'][0].split()
Out[66]:
In [ ]: