goose3 não retornou boilerplate rotulado. E, em duas tentativas, não retornou nada.

Última atualização em August 17, 2026
goose3 não retornou boilerplate rotulado. E, em duas tentativas, não retornou nada.
Resumo com IA
Nos testes em que vazamento de conteúdo era sequer mensurável, o goose3 entregou precisão de 1,0000 nos tokens de conteúdo e zero tokens contaminantes. Nenhuma palavra de navegação, anúncio, barra lateral, comentário ou promoção apareceu na saída. Nenhuma outra ferramenta, entre as seis comparadas, chegou perto disso. Ao mesmo tempo, ele teve o pior recall de artigo da amostra — 0,8243 nos 22 testes, contra 1,0000 do Mozilla Readability — porque em dois deles retornou uma string vazia. Essas métricas estão ligadas pela regra de pontuação: quando o resultado vem vazio, ele não contribui para a precisão condicional, enquanto o recall registra a perda.

Nos testes em que vazamento de conteúdo era até mensurável, o goose3 entregou precisão de 1,0000 nos tokens de conteúdo e zero tokens contaminantes. Nenhuma palavra de navegação, anúncio, barra lateral, comentário ou promoção apareceu na saída. Entre as seis ferramentas comparadas, nenhuma chegou perto desse nível.

Ao mesmo tempo, ele teve a pior cobertura de artigo da amostra — 0,8243 nos 22 testes, contra 1,0000 do Mozilla Readability — porque em dois deles retornou uma string vazia.

Essas métricas estão ligadas pela regra de pontuação: quando o resultado vem vazio, ele não entra na precisão condicional, enquanto o recall registra essa perda.

O que é o goose3

o goose3 é a continuação em Python 3 da linha que começou com o Goose, da Gravity Labs, em Scala, passando pelo python-goose. Ele é um extrator de artigos com metadados, não um simples despejador de texto: você cria um Goose, chama extract() e recebe um objeto Article com cerca de vinte e oito campos acessíveis — texto limpo, título, autores, data de publicação, imagem principal, meta description, tags, links, tweets e muito mais.

Referência oficial: repositório oficial do goose3.

System diagram: From HTML to Article Fields

Versão testada: 3.1.22, licença Apache, 912 estrelas no GitHub, último push em 2026-07-23 — com manutenção ativa no momento do teste. Python 3.14.2.

A API se resume a duas chamadas e uma obrigação:

from goose3 import Goose
g = Goose()
try:
    article = g.extract(raw_html=html)
    text = article.cleaned_text
finally:
    g.close()          # feche explicitamente após o uso

Esse close() merece destaque porque é fácil esquecer e nada avisa. Esta análise não executou um teste em loop para medir sessões retidas, conexões ou memória quando o fechamento é omitido, então falar em “vazamento de recursos” seria mais forte do que a evidência permite. Considere o fechamento explícito como um requisito de ciclo de vida indicado pela própria API.

O trade-off, medido

Seis extratores, um conjunto de fixtures anotadas, um avaliador. Cada bloco de cada fixture foi rotulado como article ou boilerplate e recebeu um token sentinela único, então “recuperou esta unidade?” vira uma checagem exata de pertencimento por substring, e não uma pontuação por similaridade.

BibliotecaRecall do artigo (22/22)Vazamento de boilerplatePrecisão dos tokens de conteúdoTokens contaminantesSaída produzida
Readability1.00000.23530.91093522/22
trafilatura0.98650.05880.9411422/22
newspaper4k0.98650.00000.9452022/22
resiliparse0.90540.05880.9381722/22
jusText0.83780.47060.87607419/22
goose30.82430.00001.0000020/22

sixway-scores.json. O recall considera os 22 testes; a taxa de vazamento e a precisão consideram apenas os 11 que contêm ao mesmo tempo unidades de artigo e de boilerplate.

Leia a coluna de precisão junto com a última coluna, sempre. Aqui, a precisão é condicional à produção de saída — uma biblioteca que retorna string vazia em uma fixture não entra nem no numerador nem no denominador, então simplesmente “não produzir nada” sai de graça nessa média. O numerador é a sobreposição multiconjunto entre os tokens não-stopword extraídos e os tokens de artigo rotulados; o denominador é todo token não-stopword extraído. “Tokens contaminantes” é mais restrito: só a sobreposição com os tokens de boilerplate rotulados. Um token extra extraído que não coincide nem com artigo nem com boilerplate reduz a precisão sem aumentar essa contagem de contaminação; tokens repetidos além do multiconjunto do artigo podem fazer o mesmo. É por isso que o newspaper4k pode mostrar 0 tokens contaminantes e precisão abaixo de 1.0000. O 1.0000 do goose3 foi calculado em 10 das 11 fixtures; Readability, trafilatura, newspaper4k e resiliparse foram pontuados em 11 de 11.

Ainda assim, o 1.0000 continua útil neste conjunto sintético. Nos dez testes pontuados, o goose3 não emitiu nenhum token rotulado como boilerplate; o Readability emitiu 35 nas mesmas páginas. Se um modelo consome a saída, isso significa zero gasto de tokens com o boilerplate rotulado nesses dez testes. Isso não prova ausência total de desperdício em páginas reais, e um resultado vazio pode gerar custo de fallback ou retry em outra parte do pipeline.

Os dois silêncios, e o que significam

o goose3 não retornou nada em exatamente duas fixtures. Uma delas é defensável; a outra é um limite real.

O documento quase vazio. Uma página com uma única unidade de artigo de 32 caracteres. O goose3 desiste. O jusText também. Neste conjunto de testes, o Readability produziu saída em todas as 22 páginas, então o resultado dele não sustenta o silêncio do goose3 aqui. Se rejeitar esse documento minúsculo é aceitável, isso depende do contrato mínimo de conteúdo do chamador.

System diagram: Treat Empty Output as Failure

O artigo composto inteiramente por elementos <li>. Seis unidades de artigo, nenhuma dentro de uma tag <p>. O goose3 devolve string vazia.

Isso chamou atenção, porque a configuração padrão do próprio goose3 define parse_lists=True. Então eu testei isso — três configurações contra um controle funcional, porque uma execução ruim não basta para concluir algo sobre uma biblioteca:

ConfiguraçãoPágina só com listaControle com <p>
padrão0 chars937 chars
strict=False0 chars937 chars
parse_lists=True (explícito)0 chars937 chars

list-only-probe.json.

Zero nas três, enquanto o controle retorna 937 caracteres nas três. Portanto, parse_lists=True define se listas são mantidas dentro de um artigo que o goose3 já localizou — não permite que o classificador trate a lista como o artigo. O score de nós do goose3 precisa de blocos com aparência de parágrafo para encontrar o corpo; uma página cujo corpo é uma lista simplesmente não oferece isso.

O resultado comprovado é mais estreito: um corpo com a forma desta fixture sintética — seis unidades de artigo, todas em <li>, sem nenhum candidato em parágrafo — retornou string vazia. Changelogs, referências de API, receitas, páginas de FAQ e posts comparativos são bons exemplos de risco para uma aplicação em páginas reais, porque podem ser dominados por listas, mas esta única fixture não prova que essas categorias falham de forma geral.

A string vazia só é detectável pela máquina se o chamador validar que a saída não está vazia. É mais fácil bloquear esse caso do que texto plausível que não contém nada do artigo, mas ainda assim é uma falha silenciosa para monitoramento baseado só em exceções. Um chamador em produção precisa de uma checagem mínima de saída e de um fallback ou registro explícito de página com falha.

A realidade da instalação

pip install goose3 baixa 16 pacotes e 44,3 MiB em cerca de 6 a 9 segundos. Importação a frio medida em um subprocesso novo: 2,181 s.

Referência oficial: goose3 no PyPI.

BibliotecaPacotessite-packagesImportação a friop50 de extração
resiliparse521.0 MiB0.015 s0.06 ms
jusText322.4 MiB0.777 s0.56 ms
goose31644.3 MiB2.181 s1.85 ms
newspaper4k2247.5 MiB2.812 s2.69 ms
trafilatura1769.9 MiB1.584 s0.51 ms

install-and-import.json. Cada biblioteca em um virtualenv vazio próprio, então nenhum peso é herdado de uma irmã.

Peso intermediário, velocidade intermediária. Instalou e importou sem problemas no Python 3.14.2, o que não é comum em toda a categoria.

Três padrões que vale conhecer antes de colocar em produção

System diagram: Three defaults worth knowing before you deploy

Ler o objeto Configuration entregue no pacote, em vez da documentação, revela dezenove ajustes. Três deles chamam atenção.

Ele se identifica. browser_user_agent tem como padrão Goose/3.1.22. Se você deixar o goose3 fazer a própria requisição, todo servidor acessado vai registrar o nome da biblioteca e a versão exata. Isso é honesto, mas também é uma assinatura digital. Defina isso deliberadamente ou busque o HTML por conta própria e passe raw_html.

Ele aponta para um binário do MacPorts. imagemagick_convert_path vem como /opt/local/bin/convert e imagemagick_identify_path como /opt/local/bin/identify. Na minha máquina, nenhum deles existe — /opt/local é do MacPorts, que a maioria das pessoas não usa; o Homebrew coloca binários em /opt/homebrew. O padrão fica inerte a menos que você ative a busca de imagens (enable_image_fetching vem False, o que faz sentido), mas se ativar esperando que a extração da imagem principal funcione, é aqui que ela simplesmente não vai funcionar.

Ele assume inglês. target_language vem como en, com use_meta_language=True, então ele segue a declaração da própria página quando existe e cai para inglês quando não existe. Ótimo para conteúdo em inglês; vale definir explicitamente para qualquer outro idioma.

O restante é razoável: parser_class é lxml, http_timeout é 30 segundos, strict está ligado, log_level é ERROR, parse_headers e keep_footnotes estão ligados, images_min_bytes é 4.000.

Memória, e o que HTML quebrado faz com ela

Dois pontos que toda análise deste lote marcou como não testados agora foram medidos.

O contexto mais amplo do teste de estresse está na comparação de memória e HTML malformado entre dez bibliotecas.

Memória residente máxima, via /usr/bin/time -l, um processo novo por célula — o piso de importação é o custo da biblioteca carregada e ociosa; os picos incluem o documento.

BibliotecaRuntimePiso de importaçãoPico com 226 KBPico com 10 MB
html2textpython3.1418.719.971.2
pyquerypython3.1430.333.9172.5
resiliparsepython3.1420.525.1225.1
markdownifypython3.1423.928.9278.5
goose3python3.1444.152.4398.5
cheerionode2266.876.5398.5
justextpython3.1430.336.6431.2
newspaper4kpython3.1452.661.8668.5
trafilaturapython3.1452.564.8927.1
turndownnode2247.868.42947.1

memory-results.json. Os baselines de Python e Node não são comparáveis entre si; o interpretador faz parte dos dois.

o goose3 tem piso de 44,1 MiB e chega a 398,5 MiB em um documento de 10 MB. Seu piso de importação é o terceiro mais alto entre as bibliotecas Python mostradas, algo importante para quem depende de inicialização rápida.

HTML quebrado. Doze documentos, cada um quebrando exatamente uma coisa — tags não fechadas, elementos inline mal aninhados, atributos sem aspas com espaços, fechamentos soltos, ausência total de <html>, atributos duplicados, um documento truncado no meio da tag, entidades inválidas, um <script> não fechado, declaração de charset mentirosa, um comentário contendo markup e 600 níveis de aninhamento — além de dois controles bem formados com tamanhos equivalentes, porque “não retornou nada” só diz algo sobre malformação se a biblioteca também não ficar muda em um documento limpo do mesmo tamanho.

o goose3 lançou exceção em 0 de 14 e não retornou nada em 10, recuperando 2/33 sentinelas entre as fixtures quebradas (malformed-results.json). Uma fixture fica fora dessa contagem: segundo HTML5, tudo depois de um <script> não fechado é conteúdo de script, então perdê-lo ali está correto e recuperá-lo é que seria o desvio.

Prós e contras

A favor. Zero tokens de boilerplate rotulados nas dez fixtures de fidelidade de conteúdo em que ele produziu saída. Cerca de vinte e oito campos de artigo estão disponíveis, embora a exatidão deles tenha sido inventariada e não pontuada. Padrão sensato para busca de imagem (desligada). Instalação limpa no Python 3.14. Ativamente mantido. Apache-2.0. É fácil bloquear resultado vazio quando o chamador verifica isso explicitamente.

Contra. O pior recall de artigo do conjunto, 0,8243, causado inteiramente por não retornar nada, e não por retornar algo errado. Uma página cujo artigo é uma lista retorna string vazia independentemente da configuração. 44,3 MiB e 2,2 segundos de importação a frio são pesados perto dos 21,0 MiB e 15 ms do resiliparse. Exige close(). Dois padrões apontam para caminhos errados na maioria das máquinas.

Quem deve usar, e quem não deve

Use o goose3 como candidato quando o texto extraído vai para um modelo ou banco de dados onde boilerplate rotulado tem custo, e as páginas são artigos convencionais com parágrafos. Neste conjunto de fixtures, ele não emitiu tokens rotulados como boilerplate quando respondeu. A camada de metadados está disponível, mas não foi validada aqui; precisão de título, autor, data e imagem precisa de fixtures reais separadas antes de virar benefício de seleção.

Evite-o se seu corpus for pesado em listas — você vai receber strings vazias e nenhuma explicação. Evite-o se custo de inicialização importa, porque o resiliparse importa 145 vezes mais rápido. E evite-o se você precisa de resposta em todas as páginas, porque “sem resposta” é um resultado real aqui: duas entre 22 fixtures, ambas silenciosas, no sentido de que string vazia não é exceção.

Uma combinação que vale testar: goose3 como principal, com fallback quando cleaned_text vier vazio ou abaixo do seu mínimo de conteúdo. O Readability recuperou todas as unidades de artigo neste conjunto de 22 fixtures, incluindo os dois casos vazios do goose3. Esse resultado sintético apoia o padrão de arquitetura, não uma promessa de que o fallback nunca vai falhar em páginas reais.

Onde uma API gerenciada entra

Este benchmark testou a rota de extração do goose3 com raw_html: o HTML já tinha sido obtido antes de o goose3 vê-lo. O goose3 também tem sua própria rota de busca na rede, como mostra a configuração de User-Agent, mas essa rota não foi testada aqui. Renderização em JavaScript e comportamento anti-bot também não foram testados.

Para as mesmas fixtures em todos os seis extratores, veja a comparação entre seis bibliotecas de extração.

Um serviço gerenciado de busca/renderização/extração, incluindo o nosso Thunderbit, cobre outra fronteira de responsabilidade. O Thunderbit não foi avaliado neste teste. A distinção relevante aqui é entre extração de artigo a partir de HTML fornecido e um serviço hospedado que obtém e processa uma URL; este artigo não traz comparação de desempenho ou qualidade na mesma métrica.

A comparação justa: o conjunto de campos do goose3 é fixo e pensado para artigos, o que é exatamente o que você quer quando suas páginas são artigos — e exatamente o oposto do que precisa quando são listagens de produtos. Se você já tem o HTML e suas páginas são artigos, o goose3 é gratuito e muito limpo.

Para o lado hospedado, nossa lista de APIs de web scraping oferece a visão mais ampla; para alternativas autogerenciadas, a página pilar de scrapers open source. Se o texto vai para um modelo, converter HTML para Markdown em Python mostra onde a fidelidade realmente se perde.

Experimente o Thunderbit para extração de dados da web

Vale a pena usar o goose3?

Sim, se artigos em formato de parágrafo combinam com a carga de trabalho e se o chamador trata saída vazia como falha de extração, e não como sucesso.

Neste conjunto de fixtures, o goose3 não emitiu tokens rotulados como boilerplate quando respondeu e retornou duas strings vazias. Uma foi uma página quase vazia e a outra foi o corpo sintético composto só por listas. Isso é uma troca entre precisão e cobertura, não uma prova de temperamento da ferramenta como um todo.

Se recall for mais importante, teste um fallback com proteção explícita de saída mínima. O Readability recuperou todas as unidades de artigo nestas 22 fixtures; o newspaper4k mostrou zero vazamento de unidades de boilerplate rotulado e recall de 0,9865, além de produzir saída em todas as 22. Esses resultados posicionam esta amostra sintética, não cargas reais desconhecidas.

o goose3 merece espaço quando o custo de uma palavra errada é maior que o custo de uma página faltando.

Experimente o Thunderbit para extração de dados da web Get Started Free

Perguntas frequentes

A precisão perfeita do goose3 é real ou só efeito de ele recusar páginas? Os dois, e isso é separável. Ele foi pontuado em 10 das 11 fixtures que contêm boilerplate, então uma fixture ficou fora da média — essa parte é efeito de ter recusado. Mas, nesses dez casos, ele retornou zero tokens contaminantes diante de boilerplate propositalmente adversarial, enquanto o Readability vazou 35. A precisão é real nas páginas em que ele responde; o recall é onde a recusa aparece.

Por que o goose3 não retorna nada em uma página cujo artigo é uma lista? O score do candidato precisa de blocos com formato de parágrafo para localizar o corpo do artigo, e uma página construída com <li> não oferece isso. O padrão parse_lists=True não muda esse ponto — eu testei explicitamente, junto com strict=False, e obtive zero caracteres nas três configurações, enquanto o controle baseado em <p> retornou 937 em todas. parse_lists decide se listas são mantidas dentro de um artigo que já foi encontrado.

Preciso chamar close()? Feche explicitamente com try/finally, como mostrado acima. Esta análise não mediu o que se acumula quando o fechamento é omitido, então não afirma um vazamento quantificado em loop; mas estabelece que Goose tem um ciclo de vida que o chamador precisa gerenciar.

O que o goose3 envia como User-Agent? Goose/3.1.22 por padrão — o nome da biblioteca e a versão exata. Isso só vale quando você deixa a biblioteca buscar o conteúdo; ao passar raw_html, esse comportamento é contornado. Se você deixar a busca acontecer, defina o User-Agent de forma consciente; o padrão informa a todo servidor exatamente quem está chamando.

O que esta análise não testou? Páginas reais, em absoluto — tudo aqui são fixtures controladas. Extração multilíngue, apesar de target_language ser uma configuração de primeira classe. Os campos de metadados (título, autores, data, imagem principal) foram inventariados, mas não avaliados quanto à precisão. Busca de imagens, que vem desligada por padrão e usa caminhos do ImageMagick apontando para um gerenciador de pacotes que a maioria das máquinas não tem. Comportamento de memória sob concorrência ou carga sustentada, além de throughput sob carga; a tabela de memória mediu um processo novo lidando com um documento.

Ke
Ke
CTO na Thunderbit | Cientista de Dados Sênior e Especialista em ML Com quase uma década de experiência em machine learning e data science, Ke Shen é ex-aluno da Columbia University e foi Cientista de Dados Sênior na Walmart Labs. Com profunda experiência, reconhecida pelos pares, em Python, R, Java e Estatística, ele compartilha insights testados em batalha sobre como levar algoritmos complexos de IA da teoria à arquitetura pronta para produção.
Sumário
Thunderbit · Agente de dados web com IA

Extraia dados de qualquer página em 1 clique

Aprovado por mais de 250.000 usuários
plano gratuito disponível
Da página web para a planilha
Descreva o que você precisa — o Agente de IA da Thunderbit extrai e exporta para Excel, Google Sheets, Airtable ou Notion. Comece grátis.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week