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):
:121 — tipo_span.get_text(strip=True) (texto curto, risco baixo)
:156 — span.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.
Sintoma
Em alguns registros, a coluna
tituloretornada porraspe.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":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: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):Os dois nós de texto (
"... E-NATJUS"e"NA JUDICIALIZAÇÃO ...") são strippados e colados →"E-NATJUSNA JUDICIALIZAÇÃO". O navegador, viatextContent, 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:Os dois casos acima passam a retornar
(NATJUS - BA)eE-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)::121—tipo_span.get_text(strip=True)(texto curto, risco baixo):156—span.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
tests/capes/samples/raspar/titulo_com_br.htmlreduzido contendo dois cards: um com<br>no título e um com filho inline + whitespace.tituloretornado 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.