Node Markdown n8n : convertir du Markdown en HTML (et l'inverse)
Publié le 25 août 2026 · 8 min de lecture
Un LLM répond en Markdown. Un email, une page WordPress ou un bloc Webflow, eux, attendent du HTML. Entre les deux il manque une conversion, et c'est exactement le travail du node Markdown de n8n (n8n-nodes-base.markdown), qui fait le trajet dans les deux sens. Ce guide couvre sa configuration réelle, les options qui changent le rendu, trois pipelines complets et les pièges qui transforment un joli tableau généré par IA en bouillie de barres verticales.
Le chaînon manquant entre un modèle et sa destination
Demandez à n'importe quel modèle de rédiger un article, un résumé ou un message : il vous renverra du Markdown. Des ## pour les titres, des ** pour le gras, des tirets pour les listes. C'est le format dans lequel ces modèles ont été entraînés à répondre, et aucune consigne ne les en dissuade durablement.
Ce n'est d'ailleurs pas qu'une habitude cosmétique : l'étude de Jia He, Mukund Rungta, David Koleczek, Arshdeep Sekhon, Franklin X. Wang et Sadid Hasan, « Does Prompt Formatting Have Any Impact on LLM Performance? » (arXiv, 2024), a comparé le même contenu présenté en texte brut, Markdown, JSON et YAML : les auteurs mesurent, sur GPT-3.5-turbo et une tâche de traduction de code, jusqu'à 40 % d'écart de performance selon le format de gabarit utilisé, des modèles plus grands comme GPT-4 se montrant nettement plus robustes à ces variations (voir sur Google Scholar). Le balisage n'est pas neutre, ni en entrée ni en sortie.
Le problème, c'est la destination. Le champ content de l'API WordPress attend du HTML. Un corps d'email en HTML attend du HTML. Un champ Rich Text Webflow attend du HTML. À l'inverse, une page web scrapée arrive en HTML et doit repartir en texte propre vers un modèle, une base vectorielle ou une page Notion. Le node Markdown est la pièce de plomberie qui manque entre les deux.
Configurer le node : trois champs, pas plus
Le node est volontairement minimal :
- Mode :
Markdown to HTMLouHTML to Markdown; - le champ source, dont le libellé change selon le mode — il s'appelle Markdown dans un sens, HTML dans l'autre. Vous y collez une expression, typiquement
{{ $json.output }}derrière un node IA, ou{{ $json.data }}derrière une requête HTTP ; - Destination Key : le champ de l'item dans lequel écrire le résultat,
datapar défaut.
C'est une différence notable avec le node XML, qui remplace la valeur dans le champ désigné. Ici le champ source reste intact : vous gardez le Markdown d'origine à côté du HTML produit, ce qui est précieux au débogage. Ne donnez à Destination Key le nom du champ source que si vous voulez vraiment écraser.
Sous le capot, deux bibliothèques distinctes font le travail : Showdown pour Markdown → HTML, node-html-markdown pour HTML → Markdown. Savoir lequel est actif explique la plupart des comportements du node — et notamment le fait que les deux listes d'options n'ont rien à voir l'une avec l'autre.
Markdown → HTML : les options qui décident du rendu
Tables Support : celle que tout le monde oublie
C'est le premier appel au support, systématiquement. Un modèle produit volontiers des tableaux en syntaxe GitHub, avec des barres verticales et une ligne de tirets. Or Tables Support est désactivée par défaut : sans elle, Showdown laisse ces lignes telles quelles et votre email affiche des | Client | Montant | en clair. Ajoutez l'option, activez-la, et vous obtenez de vraies balises <table>.
Même logique pour Strikethrough (le ~~texte~~) et Emoji Support, désactivées par défaut alors que les modèles s'en servent régulièrement.
Sauts de ligne, blocs de code, niveau de titres
Simple Line Breaks est désactivée par défaut : en Markdown canonique, un simple retour à la ligne ne crée pas de <br>, il faut deux espaces en fin de ligne. Aucun LLM ne les produit. Pour un email ou un message court, activez cette option, sinon vos paragraphes se recollent.
GitHub Code Blocks, en revanche, est activée par défaut : les blocs délimités par trois accents graves deviennent bien des <pre><code>. Header Level Start vaut 1 par défaut ; réglez-la sur 2 si votre modèle commence ses articles par un # et que vous ne voulez pas d'un second <h1> face au titre de la page. Complete HTML Document est désactivée par défaut et produit donc un fragment — exactement ce qu'attendent WordPress ou Webflow. Ne l'activez que si la destination exige un document autonome.
Enfin Encode Emails, activée par défaut, transforme les adresses en entités décimales : anti-spam correct dans un navigateur, illisible si le système en aval ré-échappe le HTML.
HTML → Markdown : nettoyer avant d'envoyer au modèle
Le trajet inverse sert surtout à une chose : réduire le bruit. Le HTML d'une page réelle est composé à 80 % de balises, de classes utilitaires et de scripts qui ne portent aucune information mais sont facturés comme tokens à chaque appel de modèle. Convertir la page en Markdown avant l'appel conserve la hiérarchie des titres, les listes et les liens, et jette le reste.
En pratique, on isole d'abord la zone utile avec le node HTML et un sélecteur CSS (article, main), puis on convertit. Les techniques de récupération de la page sont dans notre guide du scraping avec n8n ; si vous passez par Firecrawl, le service renvoie déjà du Markdown et le node devient inutile — c'est bon à savoir avant d'empiler des étapes.
Les options qui comptent dans ce sens :
- Ignored Elements : la plus rentable. Listez les sélecteurs à écarter avec leurs enfants, typiquement
nav, footer, aside, script, style, form. Vous supprimez menus et boilerplate avant même la conversion. - Place URLs At The Bottom : les liens inline deviennent des définitions de référence en bas de document. Le corps du texte redevient lisible, et les URL longues cessent de couper les phrases en deux.
- Keep Images With Data : désactivée par défaut, et c'est heureux — activée, elle conserve les images en data URI, donc du base64 qui fera exploser la facture en tokens.
- Bullet Marker (
*par défaut), Emphasis Delimiter (_), Strong Delimiter (**) et Style For Code Block (FenceouIndented) : cosmétiques, sauf si la destination a un parseur strict. - Text Replacement Pattern : une regex de remplacement, pratique pour retirer un bandeau cookie récurrent qui a survécu au filtrage.
Le Markdown obtenu a un avantage supplémentaire pour un pipeline RAG : ses titres ## sont des frontières sémantiques exploitables pour un découpage en chunks plus intelligent qu'une coupe tous les 1 000 caractères.
Trois pipelines concrets
Article IA vers WordPress. Un agent rédige en Markdown → node Markdown en Markdown to HTML avec Tables Support activée et Header Level Start à 2 → node WordPress, champ Content alimenté par {{ $json.data }}. Le montage complet, du sujet à la publication, est décrit dans notre guide publier sur WordPress automatiquement avec l'IA.
Newsletter HTML depuis une sortie LLM. Flux RSS → résumé par le modèle en Markdown → node Markdown avec Simple Line Breaks activée → node d'envoi. Attention : le node produit du HTML sémantique, pas du HTML compatible clients mail. Les messageries anciennes exigent des styles inline, à ajouter dans un gabarit après conversion. Le pipeline éditorial est détaillé dans générer une newsletter automatique, et les réglages d'envoi dans notre guide SMTP avec n8n.
Page web vers base vectorielle. HTTP Request → node HTML pour isoler main → node Markdown en HTML to Markdown avec Ignored Elements → découpage → embeddings. Vous stockez du texte plutôt que des balises, et vos chunks redeviennent lisibles à l'inspection.
Les pièges
Le HTML produit n'est pas assaini. Showdown laisse passer le HTML brut présent dans le Markdown source : un <script> glissé dans un contenu scrapé, puis converti et republié, s'exécute chez vos lecteurs. Et l'assainissement n'est pas un problème résolu : David Klein et Martin Johns ont montré, dans « Parse Me, Baby, One More Time: Bypassing HTML Sanitizer via Parsing Differentials » (IEEE Symposium on Security and Privacy, 2024), que les 11 assainisseurs HTML côté serveur testés reposaient sur des parseurs déficients, et que tous sauf deux pouvaient être contournés en exploitant les divergences d'analyse entre l'assainisseur et le navigateur (voir sur Google Scholar). Traitez donc tout Markdown d'origine externe comme hostile, et n'ouvrez jamais à un contenu non contrôlé un chemin direct vers une page publiée.
Le Markdown n'est pas standardisé. Showdown couvre le cœur du format et les extensions GitHub que vous activez. Notes de bas de page, listes de définitions, formules mathématiques entre $$ : rien de tout cela ne sera converti, et le texte ressortira brut. Si votre prompt autorise ces syntaxes, votre rendu sera irrégulier — mieux vaut contraindre le modèle, comme on le fait avec un structured output parser.
Les accents graves cassent les expressions. Un bloc de code délimité par trois accents graves collé dans une expression n8n, ou dans un template literal JavaScript d'un node Code, ferme la chaîne au mauvais endroit. Ne réinjectez pas de contenu Markdown par interpolation : branchez directement le champ ({{ $json.output }}) et laissez le node lire la valeur.
L'aller-retour n'est pas idempotent. Markdown → HTML → Markdown ne rend pas le texte d'origine à l'octet près : les délimiteurs changent, l'espacement se normalise. Ne bâtissez aucune détection de modification sur cette hypothèse.
En résumé
Le node Markdown de n8n tient en trois champs — Mode, texte source, Destination Key — mais ce sont ses options qui décident du résultat. Dans le sens Markdown → HTML, activez Tables Support et Simple Line Breaks dès le premier test, réglez Header Level Start, et assainissez avant toute republication. Dans le sens HTML → Markdown, Ignored Elements est le levier principal pour économiser des tokens sans perdre de structure. Le reste est cosmétique.
Pour aller plus loin
Si votre chaîne consiste à ingérer des pages, documents et exports pour les rendre interrogeables par une IA, la conversion en Markdown en est la première étape : le Pack Assistant RAG à 119 € fournit l'ingestion, le découpage et l'interrogation prêts à brancher derrière ce node. Et si votre sujet est plutôt le traitement d'emails entrants — extraire, résumer, répondre en HTML propre — le Pack Inbox IA à 79 € couvre le circuit complet.
FAQ
Questions fréquentes
Pourquoi mon tableau généré par l'IA ne s'affiche-t-il pas après conversion en HTML ?
Parce que l'option Tables Support du node Markdown est désactivée par défaut. Sans elle, la bibliothèque Showdown ignore la syntaxe de tableau en barres verticales du Markdown GitHub et laisse les lignes telles quelles, sous forme de texte brut. Ajoutez l'option Tables Support et activez-la : les pipes deviennent alors de vraies balises table, thead et tbody. Le même réflexe vaut pour Strikethrough et Emoji Support, désactivées elles aussi.
Quelle est la différence entre Property Name et Destination Key dans le node Markdown ?
Le node Markdown n'utilise pas Property Name : selon le mode choisi, vous renseignez un champ Markdown ou un champ HTML qui contient directement le texte à convertir, le plus souvent via une expression comme le contenu renvoyé par un node IA. Destination Key indique ensuite dans quel champ de l'item écrire le résultat, data par défaut. Le champ source n'est donc pas écrasé, sauf si vous donnez le même nom à Destination Key.
Le node Markdown assainit-il le HTML qu'il produit ?
Non. La conversion Markdown vers HTML repose sur Showdown, qui laisse passer le HTML brut présent dans le Markdown source, y compris des balises script ou des attributs onerror. Si le Markdown vient d'un LLM alimenté par du contenu externe, ou d'un formulaire public, vous devez assainir le HTML avant de le republier, avec un node Code utilisant une bibliothèque dédiée ou un service d'assainissement en amont de la publication.
Pourquoi convertir une page web en Markdown avant de l'envoyer à un modèle ?
Parce que le HTML d'une page réelle est majoritairement composé de balises, d'attributs de classe et de scripts qui n'apportent aucune information au modèle mais sont facturés comme tokens. Le mode HTML to Markdown, combiné à l'option Ignored Elements pour écarter nav, footer, script et style, réduit fortement le volume envoyé tout en conservant la hiérarchie des titres, les listes et les liens, qui servent ensuite au découpage en chunks.
Bundle FlowKit Complet
269 €