Skip to main content

Extrair Planejamento de Aula para SQLite

O extrair_planejamento.py lê arquivos HTML de Planejamento de Aula (exportados do sistema acadêmico da UTFPR) e grava as informações em três bancos SQLite3 distintos, um para cada tipo de conteúdo:

BancoTabelaConteúdo
sincrona.dbatividades_sincronasAtividades Síncrona (aulas presenciais/síncronas)
assincrona.dbatividades_assincronasAtividades Assíncrona (EaD)
procedimentos.dbprocedimentos_ensinoProcedimentos de Ensino

Cada registro guarda também a origem (nome do arquivo, disciplina, código e professor), o que permite consolidar várias disciplinas nos mesmos bancos.

Pré-requisitos​

  • Python 3.9 ou superior (o script usa argparse.BooleanOptionalAction).
  • Biblioteca beautifulsoup4.
pip install beautifulsoup4
py -m pip install beautifulsoup4

Uso rápido​

Terminal
# Processa arquivos específicos (bancos no diretório atual)
python3 extrair_planejamento.py aula1.html aula2.html

# Processa todos os .html de uma pasta -> bancos em ./htmls/bancos
python3 extrair_planejamento.py --dir ./htmls

# Define explicitamente a pasta de saída
python3 extrair_planejamento.py --dir ./htmls --out ./bancos
Sem argumentos

Se você executar python3 extrair_planejamento.py sem nenhum parâmetro, o script procura por *.html no diretório atual e grava os bancos ali mesmo.

Opções da linha de comando​

OpçãoDescrição
arquivosUm ou mais arquivos HTML de entrada (posicional).
--dir DIRProcessa todos os *.html do diretório informado.
--out OUTDiretório de saída dos bancos. Ver regra de destino abaixo.
--limpar / --no-limparEsvazia (ou não) as tabelas antes de inserir. Padrão: --limpar.
-h, --helpMostra a ajuda.

Você pode combinar arquivos posicionais com --dir; o script junta as duas listas e remove duplicatas.

Onde os bancos são gravados​

O destino é resolvido nesta ordem:

  1. --out informado → usa exatamente o diretório indicado.
  2. --out omitido + --dir X → grava em X/bancos (ex.: --dir ./htmls → ./htmls/bancos).
  3. --out omitido e sem --dir → grava no diretório atual.

Limpeza das tabelas (--limpar)​

Por padrão, o script esvazia as três tabelas e reinicia os IDs antes de inserir. Isso torna a execução idempotente: rodar duas vezes sobre os mesmos arquivos mantém a contagem estável, sem duplicar registros.

# Padrão: zera as tabelas e regrava (evita duplicação)
python3 extrair_planejamento.py --dir ./htmls

# Acrescenta aos dados já existentes (não apaga nada)
python3 extrair_planejamento.py --dir ./htmls --no-limpar
A limpeza é global

--limpar apaga todos os registros dos bancos de destino, inclusive de disciplinas importadas em execuções anteriores cujos HTMLs não estejam na pasta atual. Se o seu objetivo é montar um banco consolidado ao longo de várias execuções, use --no-limpar a partir da segunda importação.

Esquema dos bancos​

Tabela atividades_sincronas:

ColunaTipoDescrição
idINTEGERChave primária (autoincremento).
arquivoTEXTNome do HTML de origem.
disciplinaTEXTNome da disciplina.
codigoTEXTCódigo da disciplina/turma.
professor_disciplinaTEXTProfessor(a) da disciplina.
semanaINTEGERNúmero da semana.
semana_inicioTEXTData inicial da semana (dd/mm/aaaa).
semana_fimTEXTData final da semana (dd/mm/aaaa).
dataTEXTData da aula síncrona.
chtTEXTCarga horária teórica (CHT).
ch_planejadaTEXTCarga horária planejada.
professorTEXTProfessor(a) da aula.
conteudo_previstoTEXTConteúdo previsto.

Consultando os dados​

Depois de gerar os bancos, você pode consultá-los com o cliente sqlite3 ou diretamente em Python.

sqlite3 -header -column sincrona.db \
"SELECT semana, data, conteudo_previsto
FROM atividades_sincronas
WHERE codigo = 'ELT73A-S22'
ORDER BY semana;"

Saída no terminal​

Ao final, o script exibe um resumo por arquivo e o total geral:

[20260807_160725.html] ELT73A-S22 - SISTEMAS MICROCONTROLADOS
Sincronas: 14 | Assincronas: 15 | Procedimentos: 5

==================== RESUMO ====================
Arquivos processados : 2
Modo : limpar (tabelas zeradas)
sincrona.db : 31 registros
assincrona.db : 15 registros
procedimentos.db : 11 registros
Bancos gravados em : /caminho/para/htmls/bancos
Contagens do resumo

Os números do resumo referem-se aos registros inseridos naquela execução. Com --no-limpar, o total dentro da tabela pode ser maior, pois os dados são acumulados às importações anteriores.

Solução de problemas​

  • ModuleNotFoundError: No module named 'bs4' — instale a dependência com pip install beautifulsoup4.
  • Nenhum arquivo HTML encontrado. — verifique o caminho passado em --dir ou os nomes dos arquivos; sem argumentos, o script só olha o diretório atual.
  • Registros duplicados — provavelmente você usou --no-limpar mais de uma vez sobre os mesmos arquivos. Rode novamente no modo padrão (--limpar) para regravar do zero.

Planejamento → JSON → MDX (Docusaurus)​

Pipeline que transforma os bancos SQLite gerados pelo extrair_planejamento.py em páginas MDX do Docusaurus.

bancos/*.db ──(gerar-json.js · node:sqlite)──► src/data/*.json
src/data/*.json ──(React / gerar-mdx.js)──► docs/planejamento/*.mdx

Estrutura​

.
├── package.json
├── bancos/ # coloque aqui sincrona.db, assincrona.db, procedimentos.db
├── scripts/
│ ├── gerar-json.js # SQLite -> JSON (node:sqlite embutido)
│ └── gerar-mdx.js # JSON -> páginas MDX
├── src/
│ ├── data/ # JSON gerado
│ │ ├── sincrona.json
│ │ ├── assincrona.json
│ │ ├── procedimentos.json
│ │ └── disciplinas.json # consolidado (1 objeto por disciplina)
│ └── components/
│ └── TabelaPlanejamento.jsx
└── docs/
└── planejamento/ # páginas MDX geradas
├── index.mdx
└── <slug-da-disciplina>.mdx

Pré-requisitos​

  • Node.js 22.5 ou superior (recomendado 24 LTS). Os scripts usam o SQLite embutido do Node (node:sqlite), então não há dependência nativa nem necessidade de compilar nada.

Não é necessário npm install para gerar o JSON/MDX — os scripts não têm dependências externas. Em versões Node 22.5–23.3, rode o gerar-json.js com a flag --experimental-sqlite (no Node 23.4+/24 não é preciso).

Uso​

Copie os três bancos para ./bancos/ e rode:

npm run gerar # gera JSON e depois as páginas MDX
# ou separadamente:
npm run gerar:json # bancos/*.db -> src/data/*.json
npm run gerar:mdx # src/data/disciplinas.json -> docs/planejamento/*.mdx

Parâmetros podem ser ajustados chamando os scripts diretamente:

node scripts/gerar-json.js --db-dir ./bancos --out ./src/data
node scripts/gerar-mdx.js --data ./src/data/disciplinas.json --out ./docs/planejamento

Formato do JSON​

disciplinas.json (o mais usado pelo React) tem esta forma:

{
"geradoEm": "2026-08-17T...",
"totalDisciplinas": 2,
"disciplinas": [
{
"codigo": "ELT73A-S22",
"disciplina": "SISTEMAS MICROCONTROLADOS",
"professor": "Adriano Ruseler",
"slug": "elt73a-s22",
"sincronas": [
{
"semana": 1,
"data": "...",
"cht": 3,
"ch_planejada": 3,
"professor": "...",
"conteudo_previsto": "..."
}
],
"assincronas": [
{
"semana": 1,
"data_inicio": "...",
"data_fim": "...",
"ch_ead": 1,
"conteudo_previsto": "..."
}
],
"procedimentos": [{ "atividade": "...", "descricao": "..." }]
}
]
}

Os arquivos sincrona.json, assincrona.json e procedimentos.json trazem cada tipo isoladamente, também agrupado por disciplina, caso você prefira consumir um tipo por vez.

Como o React cria as páginas MDX​

Cada página gerada em docs/planejamento/<slug>.mdx seleciona a disciplina pelo slug e delega a renderização ao componente React:

---
title: SISTEMAS MICROCONTROLADOS
slug: /planejamento/elt73a-s22
---

import disciplinas from "@site/src/data/disciplinas.json";
import TabelaPlanejamento from "@site/src/components/TabelaPlanejamento";

export const disciplina = disciplinas.disciplinas.find(
(item) => item.slug === "elt73a-s22",
);

# SISTEMAS MICROCONTROLADOS

<TabelaPlanejamento disciplina={disciplina} />

O JSON permanece como única fonte de verdade: ao reprocessar os HTML e regenerar os bancos e o JSON, as páginas passam a refletir os novos dados sem edição manual.

Integração no seu projeto Docusaurus​

  1. Copie scripts/, src/components/TabelaPlanejamento.jsx e os JSON de src/data/ para o seu projeto Docusaurus (mantendo os caminhos).
  2. Adicione as dependências e os scripts do package.json ao do seu site.
  3. (Opcional) Rode npm run gerar:mdx para criar as páginas em docs/, ou escreva suas próprias páginas MDX importando o JSON e o componente.
  4. Se usa sidebars.js manual, inclua os itens de docs/planejamento/.