Skip to content

fix(capes): titulos perdem espaco quando ha <br> ou texto multi-no (get_text(strip=True)) #40

Description

@bdcdo

Sintoma

Em alguns registros, a coluna titulo retornada por raspe.capes().raspar(...) aparece com palavras coladas — falta o espaço que o navegador exibe.

Detectado comparando o DataFrame com a árvore renderizada via Playwright em pesquisa="natjus":

id scraper portal (navegador)
W4388508904 ... (NATJUS- BA) ... ... (NATJUS - BA) ...
W4391884248 ... E-NATJUSNA JUDICIALIZAÇÃO ... ... E-NATJUS NA JUDICIALIZAÇÃO ...

Não corrompe id, autores, ano, revista, doi nem nenhuma outra coluna — só o titulo.

Causa raiz

src/raspe/scrapers/capes.py:128:

out['titulo'] = titulo_a.get_text(strip=True) if titulo_a else ''

BeautifulSoup.get_text(strip=True) concatena todos os nós de texto descendentes sem separador, depois strippa whitespace de cada um. Quando o HTML do título tem um <br> ou um filho inline com texto cercado por whitespace, as duas metades ficam encostadas. Exemplo (W4391884248):

<a class="titulo-busca" ...>
  ... O IMPACTO DO SISTEMA E-NATJUS<br>
  NA JUDICIALIZAÇÃO DO DIREITO À SAÚDE
</a>

Os dois nós de texto ("... E-NATJUS" e "NA JUDICIALIZAÇÃO ...") são strippados e colados → "E-NATJUSNA JUDICIALIZAÇÃO". O navegador, via textContent, preserva o whitespace original ao redor do <br> e mostra o espaço.

Fix sugerido

Trocar para get_text(' ', strip=True) — o primeiro argumento é o separador inserido entre nós antes da concatenação:

out['titulo'] = titulo_a.get_text(' ', strip=True) if titulo_a else ''

Os dois casos acima passam a retornar (NATJUS - BA) e E-NATJUS NA JUDICIALIZAÇÃO, batendo com o portal.

Outros campos potencialmente vulneráveis

Mesmo padrão get_text(strip=True) em _parse_card (src/raspe/scrapers/capes.py):

  • :121tipo_span.get_text(strip=True) (texto curto, risco baixo)
  • :156span.get_text(strip=True) para tópicos (depende do HTML)

bq.get_text(' ', strip=True) em :145 (resumo) já usa separador — OK. Os blocos com <b> em :163-169 (ano/instituição/revista) são tokens estruturados com validação por regex, sem risco.

Recomendação conservadora: trocar só :128 (caso comprovado) num PR pequeno, com um teste de regressão usando um sample contendo <br> no título.

Plano de teste

  • Sample tests/capes/samples/raspar/titulo_com_br.html reduzido contendo dois cards: um com <br> no título e um com filho inline + whitespace.
  • Caso de teste: o titulo retornado deve conter os espaços nos pontos esperados.

Como detectei

PR #37 (mergeado) introduziu o scraper. Comparei raspe.capes().raspar(pesquisa="natjus", paginas=range(1, 2)) contra o portal via Playwright nos 5 primeiros cards. 3/5 batem 100%; os 2 restantes têm exatamente o whitespace divergente descrito acima.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions