Pular para conteúdo

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:

  1. Simplicidade: Extrair apenas o conteúdo textual sem formatação HTML
  2. Limpeza: Remover automaticamente scripts, estilos e elementos de navegação
  3. Análise: Preparar conteúdo HTML para análise de texto ou processamento
  4. 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:

  1. Carrega o HTML: Lê o conteúdo HTML da variável especificada
  2. Limpa o HTML: Remove scripts, estilos, navegação, headers, footers e sidebars
  3. Extrai o texto: Usa Cheerio para extrair todo o texto visível do body
  4. Normaliza espaços: Remove espaços extras e linhas vazias (se preserveFormatting = false)
  5. Armazena o resultado: Salva o texto limpo na variável de saída
  6. 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

  1. Análise de conteúdo web: "Extrair texto de artigos web para análise de sentimento"
  2. Preparação para análise: "Limpar HTML de emails para processar o conteúdo com análise de texto"
  3. Conversão de dados: "Transformar conteúdo HTML em texto puro para armazenar em banco de dados"
  4. 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_markdown para manter negrito, links e estrutura
  • Precisa extrair estrutura: Use parse_structured para obter headings, listas e tabelas organizadas
  • Precisa dados específicos: Use parse_custom com 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: true sempre para segurança
  • Use removeStyles: true para limpar formatação CSS
  • Defina outputVariable com nome descritivo do conteúdo
  • Use metadataVariable quando precisar de estatísticas
  • Normalize espaços com preserveFormatting: false para 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 removeScripts a 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