py-lexml-acervo
é um wrapper para a API de consulta do acervo do projeto LexML.
Trata-se de um portal especializado em informação jurídica e legislativa. Pretende-se reunir leis, decretos, acórdãos, súmulas, projetos de leis entre outros documentos das esferas federal, estadual e municipal dos Poderes Executivo, Legislativo e Judiciário de todo o Brasil: uma rede de informação legislativa e jurídica que pretende organizar, integrar e dar acesso às informações disponibilizadas nos diversos portais de órgãos do governo na Internet. @Fonte.
A API do LexML permite realizar pesquisas por meio de URLs e receber o resultado no formato XML. A API segue o padrão definido pelo Biblioteca do Congresso Norte-americano no projeto Search/Retrieval via URL (SRU).
Entre os dias 12 a 13 de agosto de 2019 por meio da presente API foram coletados os metadados do acervo do LexML de publicações datadas entre os anos de 1556 a 2019. O referido dataset está disponível na plataforma Kaggle. Para acessá-lo basta clicar na imagem abaixo. O dataset possui aproximadamente 2GB compactado, e descompacto em torno de 10GB.
<tipoDocumento>
<facet-tipoDocumento>
<date>
<urn>
<localidade>
<facet-localidade>
<autoridade>
<facet-autoridade>
<title>
<description>
<subject>
<type>
<identifier>
<srw:recordData>
<srw_dc:dc xsi:schemaLocation="info:srw/schema/1/dc-schema http://www.loc.gov/z3950/agency/zing/srw/dc-schema.xsd">
<tipoDocumento>Lei</tipoDocumento>
<facet-tipoDocumento>Legislação::Lei</facet-tipoDocumento>
<dc:date>1983-12-05</dc:date>
<urn>urn:lex:br;rondonia:estadual:lei:1983-12-05;12</urn>
<localidade>Rondônia</localidade>
<facet-localidade>Estados::Rondônia</facet-localidade>
<autoridade>Estadual</autoridade>
<facet-autoridade>Estadual</facet-autoridade>
<dc:title>Lei ordinária nº 12, de 05 de Dezembro de 1983</dc:title>
<dc:description>ABRE CRÉDITO SUPLEMENTAR NO ORÇAMENTO VIGENTE.</dc:description>
<dc:subject>CRÉDITO SUPLEMENTAR</dc:subject>
<dc:type>html</dc:type>
<dc:identifier>000349953</dc:identifier>
</srw_dc:dc>
</srw:recordData>
git clone https://github.com/netoferraz/py-lexml-acervo.git
cd py-lexml-acervo
python -m venv .venv
source ./.venv/bin/activate
pip install -r requirements.txt
As consultas à API se baseiam na classe LexmlAcervo
localizada em ./apis/acervo
. Para realizar uma consulta se deve instanciar a referida classe passando como parâmetro de inicialização uma query string
no padrão CQL.
#exemplo de inicialização
consulta_acervo_2019 = LexmlAcervo("date=2019")
A efetiva consulta à API ocorre pela chamada de um dos métodos a seguir: query
ou automatic_pagination
. O primeiro é um chamado manual à API passando os parâmetros startRecord
e maximumRecordsPerPage
que são respectivamente: a posição de início no set de resultados retornado pela API gerado pela query_string
, enquanto o segundo faz uso dos mesmos parâmetros realizando um esgotamento da resposta associada a query_string
. Portanto, ao se utilizar o método automatic_pagination
ele fará a paginação automática de todo o resultado associado à consulta.
#consulta qualquer urn que contenha a palavra decreto
#e que seja de um documento associado ao ano de 2018
urn_decreto_2018 = LexmlAcervo("urn any decreto and date any 2018")
#faz a chamada a API iniciando no primeiro resultado
#e solicita 100 resultados por paginação
tree, start_record_next_query, maximumRecordsPerPage = urn_decreto_2018.query(startRecord=1, maximumRecordsPerPage=100)
#consulta qualquer urn que contenha a palavra decreto
#e que seja de um documento associado ao ano de 2018
urn_decreto_2018 = LexmlAcervo("urn any decreto and date any 2018")
#O método automatic_pagination faz uma chamada recursiva
#atualizando o parâmetro startRecord até o esgotamento da resposta.
urn_decreto_2018.automatic_pagination(startRecord=1, maximumRecordsPerPage=100)
Cada página do set de resultados da query string
será armazenado em um arquivo XML
distinto. Para
realizar a persistência dos resultados deve-se invocar o método saveResults
da instância da classe LexmlAcervo
. O referido método possui dois parâmetros obrigatórios: path
e filename
. O primeiro é o diretório onde se deseja salvar os arquivos e o segundo é o nome base dos arquivos.
urn_decreto_2018.saveResults("./data/xml/decreto/2018", "2018")
A classe XmlToJson
oferece uma interface para converter os arquivos XML em JSON.
year = 2018
#listar os arquivos XML
xmlpath = Path(f"./data/xml/decreto/{year}").glob("*.xml")
#transforma os arquivos XML em JSON
jsonFiles = [XmlToJson(xmlfile).parseToJson() for xmlfile in xmlpath]
#persiste os arquivos em disco.
XmlToJson.saveResults(jsonFiles, f"./data/json/{year}", f"{year}")