PARSE_TEXT - Extração de Texto Puro do HTML
O que é este Node?
O PARSE_TEXT é o node responsável por extrair texto puro de conteúdo HTML, removendo todas as tags, scripts, estilos e elementos de formatação, retornando apenas o conteúdo textual limpo.
Por que este Node existe?
Trabalhar com HTML bruto pode ser complexo e incluir muita informação desnecessária (tags, scripts, estilos). O PARSE_TEXT existe para:
- Simplicidade: Extrair apenas o conteúdo textual sem formatação HTML
- Limpeza: Remover automaticamente scripts, estilos e elementos de navegação
- Análise: Preparar conteúdo HTML para análise de texto ou processamento
- Integração: Facilitar o uso de conteúdo web em outros sistemas que não interpretam HTML
Como funciona internamente?
Quando o PARSE_TEXT é executado, o sistema:
- Carrega o HTML: Lê o conteúdo HTML da variável especificada
- Limpa o HTML: Remove scripts, estilos, navegação, headers, footers e sidebars
- Extrai o texto: Usa Cheerio para extrair todo o texto visível do body
- Normaliza espaços: Remove espaços extras e linhas vazias (se preserveFormatting = false)
- Armazena o resultado: Salva o texto limpo na variável de saída
- Retorna metadados: Fornece estatísticas sobre o tamanho original vs. processado
Código interno (html-parser-executor.service.ts:273-284):
private parseToText($: CheerioAPI, config: HTMLParserNodeData): string {
let text = $('body').text();
if (!config.preserveFormatting) {
// Normalize whitespace
text = text.replace(/\s+/g, ' ');
// Remove empty lines
text = text.split('\n').filter(line => line.trim()).join('\n');
}
return text.trim();
}
Quando você DEVE usar este Node?
Use PARSE_TEXT sempre que precisar de extrair conteúdo textual limpo de HTML:
Casos de uso
- Análise de conteúdo web: "Extrair texto de artigos web para análise de sentimento"
- Preparação para análise: "Limpar HTML de emails para processar o conteúdo com análise de texto"
- Conversão de dados: "Transformar conteúdo HTML em texto puro para armazenar em banco de dados"
- Processamento de scraping: "Processar resultado de web scraping removendo toda formatação HTML"
Quando NÃO usar PARSE_TEXT
- Precisa preservar formatação: Use
parse_markdownpara manter negrito, links e estrutura - Precisa extrair estrutura: Use
parse_structuredpara obter headings, listas e tabelas organizadas - Precisa dados específicos: Use
parse_customcom seletores CSS para extrair elementos específicos
Parâmetros Detalhados
inputVariable (string, obrigatório)
O que é: Nome da variável que contém o conteúdo HTML a ser processado.
Padrão: "html_content"
Flow completo para testar:
{
"name": "Teste HTML Parser - Parse Text",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Definir HTML",
"parameters": {
"variableName": "html_content",
"variableValue": "<html><body><h1>Título</h1><p>Parágrafo com <b>negrito</b> e <a href='#'>link</a>.</p><script>alert('teste');</script></body></html>"
}
}
},
{
"id": "parser_1",
"type": "html_parser",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Extrair Texto",
"parameters": {
"inputVariable": "html_content",
"parseMode": "text",
"outputVariable": "texto_limpo"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mostrar Resultado",
"parameters": {
"message": "Texto extraído:\n{{texto_limpo}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "parser_1" },
{ "source": "parser_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Importe o flow e execute. Esperado: "Texto extraído: Título Parágrafo com negrito e link." (sem tags HTML nem script)
parseMode (string, obrigatório)
O que é: Modo de parsing do HTML. Para PARSE_TEXT, deve ser "text".
Padrão: "text"
Flow completo para testar:
{
"name": "Teste HTML Parser - Modo Text",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Definir HTML",
"parameters": {
"variableName": "meu_html",
"variableValue": "<div><h1>Cabeçalho</h1><ul><li>Item 1</li><li>Item 2</li></ul></div>"
}
}
},
{
"id": "parser_1",
"type": "html_parser",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Parser Texto",
"parameters": {
"inputVariable": "meu_html",
"parseMode": "text",
"outputVariable": "resultado"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Resultado",
"parameters": {
"message": "{{resultado}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "parser_1" },
{ "source": "parser_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Esperado: "Cabeçalho Item 1 Item 2" (texto sem estrutura de lista)
outputVariable (string, opcional)
O que é: Nome da variável onde será armazenado o texto extraído.
Padrão: "parsed_content"
Flow completo para testar:
{
"name": "Teste HTML Parser - Output Variable",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "HTML Source",
"parameters": {
"variableName": "source",
"variableValue": "<p>Conteúdo importante aqui</p>"
}
}
},
{
"id": "parser_1",
"type": "html_parser",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Extrair",
"parameters": {
"inputVariable": "source",
"parseMode": "text",
"outputVariable": "texto_final"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Exibir",
"parameters": {
"message": "Conteúdo: {{texto_final}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "parser_1" },
{ "source": "parser_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Esperado: "Conteúdo: Conteúdo importante aqui"
removeScripts (boolean, opcional)
O que é: Remove tags <script> e <noscript> do HTML antes de extrair o texto.
Padrão: true
Flow completo para testar:
{
"name": "Teste HTML Parser - Remove Scripts",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "HTML com Script",
"parameters": {
"variableName": "html_com_script",
"variableValue": "<div>Texto visível<script>console.log('código');</script></div>"
}
}
},
{
"id": "parser_1",
"type": "html_parser",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Parser com Remove",
"parameters": {
"inputVariable": "html_com_script",
"parseMode": "text",
"removeScripts": true,
"outputVariable": "limpo"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Resultado",
"parameters": {
"message": "Texto: {{limpo}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "parser_1" },
{ "source": "parser_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Esperado: "Texto: Texto visível" (script removido)
removeStyles (boolean, opcional)
O que é: Remove tags <style> e atributos style dos elementos HTML.
Padrão: true
Flow completo para testar:
{
"name": "Teste HTML Parser - Remove Styles",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "HTML com Styles",
"parameters": {
"variableName": "html_styled",
"variableValue": "<div style='color:red'>Texto colorido</div><style>.classe { font-size: 14px; }</style>"
}
}
},
{
"id": "parser_1",
"type": "html_parser",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Limpar Estilos",
"parameters": {
"inputVariable": "html_styled",
"parseMode": "text",
"removeStyles": true,
"outputVariable": "sem_estilos"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mostrar",
"parameters": {
"message": "{{sem_estilos}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "parser_1" },
{ "source": "parser_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Esperado: "Texto colorido" (styles removidos)
preserveFormatting (boolean, opcional)
O que é: Preserva espaços e quebras de linha originais do HTML ao invés de normalizar.
Padrão: false
Flow completo para testar:
{
"name": "Teste HTML Parser - Preserve Formatting",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "HTML Formatado",
"parameters": {
"variableName": "html_formatado",
"variableValue": "<pre>Linha 1\n Linha 2 com espaços\nLinha 3</pre>"
}
}
},
{
"id": "parser_1",
"type": "html_parser",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Preservar Formato",
"parameters": {
"inputVariable": "html_formatado",
"parseMode": "text",
"preserveFormatting": true,
"outputVariable": "com_formato"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Ver Resultado",
"parameters": {
"message": "{{com_formato}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "parser_1" },
{ "source": "parser_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Esperado: Texto com quebras de linha e espaçamento preservados
metadataVariable (string, opcional)
O que é: Nome da variável onde serão armazenados metadados sobre o parsing (tamanhos, links, imagens).
Padrão: Não define (metadados não são salvos)
Flow completo para testar:
{
"name": "Teste HTML Parser - Metadata",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "HTML",
"parameters": {
"variableName": "html",
"variableValue": "<div><p>Parágrafo 1</p><p>Parágrafo 2</p></div>"
}
}
},
{
"id": "parser_1",
"type": "html_parser",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Parse com Metadata",
"parameters": {
"inputVariable": "html",
"parseMode": "text",
"outputVariable": "texto",
"metadataVariable": "info"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mostrar Info",
"parameters": {
"message": "Texto: {{texto}}\nTamanho original: {{info.originalLength}}\nTamanho final: {{info.parsedLength}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "parser_1" },
{ "source": "parser_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Esperado: Texto extraído + informações sobre tamanhos
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| inputVariable | string | Sim | Variável contendo o HTML a processar |
| parseMode | string | Sim | Modo de parsing (use "text" para esta operação) |
| outputVariable | string | Não | Variável para armazenar resultado (padrão: "parsed_content") |
| removeScripts | boolean | Não | Remove tags script/noscript (padrão: true) |
| removeStyles | boolean | Não | Remove tags style e atributos (padrão: true) |
| preserveFormatting | boolean | Não | Preserva espaços e quebras (padrão: false) |
| metadataVariable | string | Não | Variável para metadados do parsing |
Exemplo 1: Extrair Texto de Artigo Web
Objetivo: Extrair conteúdo textual limpo de um artigo HTML para análise
JSON para Importar
{
"name": "Extração de Artigo Web",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Artigo HTML",
"parameters": {
"variableName": "artigo_html",
"variableValue": "<html><head><title>Artigo</title><style>.ad { display: none; }</style></head><body><nav>Menu</nav><article><h1>Título do Artigo</h1><p>Primeiro parágrafo do artigo.</p><p>Segundo parágrafo com informação importante.</p></article><aside>Propaganda</aside><script>trackEvent();</script></body></html>"
}
}
},
{
"id": "parser_1",
"type": "html_parser",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Extrair Texto Limpo",
"parameters": {
"inputVariable": "artigo_html",
"parseMode": "text",
"removeScripts": true,
"removeStyles": true,
"preserveFormatting": false,
"outputVariable": "texto_artigo",
"metadataVariable": "stats"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Exibir Resultado",
"parameters": {
"message": "📄 Artigo extraído:\n\n{{texto_artigo}}\n\n📊 Estatísticas:\nOriginal: {{stats.originalLength}} chars\nProcessado: {{stats.parsedLength}} chars"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "parser_1" },
{ "source": "parser_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: 📄 Artigo extraído:
Título do Artigo Primeiro parágrafo do artigo. Segundo parágrafo com informação importante.
📊 Estatísticas:
Original: 350 chars
Processado: 98 chars
Exemplo 2: Processar Email HTML
Objetivo: Extrair texto de email HTML para análise de conteúdo
JSON para Importar
{
"name": "Processar Email HTML",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Receber HTML",
"parameters": {
"message": "Cole o HTML do email:",
"variableName": "email_html"
}
}
},
{
"id": "parser_1",
"type": "html_parser",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Extrair Conteúdo",
"parameters": {
"inputVariable": "email_html",
"parseMode": "text",
"removeScripts": true,
"removeStyles": true,
"outputVariable": "email_texto"
}
}
},
{
"id": "ai_1",
"type": "ai",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Analisar Sentimento",
"parameters": {
"prompt": "Analise o sentimento deste email: {{email_texto}}",
"outputVariable": "analise"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Resultado",
"parameters": {
"message": "✉️ Conteúdo do email:\n{{email_texto}}\n\n🤖 Análise:\n{{analise}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "parser_1" },
{ "source": "parser_1", "target": "ai_1" },
{ "source": "ai_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: Cole o HTML do email:
Usuário: <html><body><p>Olá, estou muito satisfeito com o produto!</p></body></html>
Sistema: ✉️ Conteúdo do email:
Olá, estou muito satisfeito com o produto!
🤖 Análise:
O email expressa satisfação positiva com o produto recebido.
Exemplo 3: Preparar Dados para Banco
Objetivo: Limpar conteúdo HTML para armazenamento em banco de dados
JSON para Importar
{
"name": "HTML para Banco de Dados",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Conteúdo HTML",
"parameters": {
"variableName": "post_html",
"variableValue": "<div class='post'><h2>Post no Blog</h2><p>Este é um <strong>post importante</strong> sobre <em>tecnologia</em>.</p><p>Visite nosso <a href='https://site.com'>site</a>.</p></div>"
}
}
},
{
"id": "parser_1",
"type": "html_parser",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Converter para Texto",
"parameters": {
"inputVariable": "post_html",
"parseMode": "text",
"outputVariable": "post_texto"
}
}
},
{
"id": "variable_2",
"type": "variable",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Simular Gravação",
"parameters": {
"variableName": "salvo",
"variableValue": "true"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ Dados salvos no banco:\n\nTexto: {{post_texto}}\nStatus: Gravado com sucesso"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "parser_1" },
{ "source": "parser_1", "target": "variable_2" },
{ "source": "variable_2", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: ✅ Dados salvos no banco:
Texto: Post no Blog Este é um post importante sobre tecnologia. Visite nosso site.
Status: Gravado com sucesso
Resposta do Node
{
"success": true,
"data": {
"parsed_content": "Texto extraído do HTML",
"stats": {
"originalLength": 350,
"parsedLength": 98,
"mode": "text",
"hasLinks": 0,
"hasImages": 0
}
},
"executionTime": 45,
"logs": [
"Parsed HTML in text mode",
"Original: 350 chars → Parsed: 98 chars"
]
}
Boas Práticas
✅ SIM:
- Use
removeScripts: truesempre para segurança - Use
removeStyles: truepara limpar formatação CSS - Defina
outputVariablecom nome descritivo do conteúdo - Use
metadataVariablequando precisar de estatísticas - Normalize espaços com
preserveFormatting: falsepara texto limpo
❌ NÃO:
- Não use PARSE_TEXT quando precisar manter estrutura (use parse_structured)
- Não use quando precisar de formatação Markdown (use parse_markdown)
- Não desative
removeScriptsa menos que seja absolutamente necessário - Não processe HTML muito grande sem verificar performance
Dicas
💡 Dica 1: PARSE_TEXT remove automaticamente elementos de navegação (nav, header, footer, aside, sidebar), focando no conteúdo principal
💡 Dica 2: Combine com web_scraper para extrair e limpar conteúdo de sites em um único flow
💡 Dica 3: Use metadataVariable para comparar tamanho antes/depois e validar se a extração foi bem-sucedida
💡 Dica 4: Se o resultado tiver muito texto colado, considere usar preserveFormatting: true para manter estrutura
💡 Dica 5: Para processar múltiplos HTMLs, use LOOP + PARSE_TEXT para automação em massa
Próximo Node
→ PARSE_MARKDOWN - Converte HTML para formato Markdown preservando formatação → PARSE_STRUCTURED - Extrai estrutura organizada do HTML (headings, listas, tabelas) → PARSE_CUSTOM - Extrai elementos específicos usando seletores CSS