AutomationFlowsWeb Scraping › Generate RSS Feed from Website Content

Generate RSS Feed from Website Content

Original n8n title: Create an RSS Feed Based on a Website S Content

Create An Rss Feed Based On A Website S Content. Uses manualTrigger, itemLists, htmlExtract, httpRequest. Event-driven trigger; 12 nodes.

Event trigger★★★★☆ complexity12 nodesItem ListsHtml ExtractHTTP RequestFunction Item
Web Scraping Trigger: Event Nodes: 12 Complexity: ★★★★☆ Added:

This workflow follows the HTTP Request → Itemlists recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "nodes": [
    {
      "name": "On clicking 'execute'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        240,
        300
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "name": "Item Lists",
      "type": "n8n-nodes-base.itemLists",
      "position": [
        1120,
        300
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "post"
      },
      "typeVersion": 1
    },
    {
      "name": "Extract Posts",
      "type": "n8n-nodes-base.htmlExtract",
      "position": [
        900,
        300
      ],
      "parameters": {
        "options": {},
        "extractionValues": {
          "values": [
            {
              "key": "post",
              "cssSelector": ".blog-listing__post-content",
              "returnArray": true,
              "returnValue": "html"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Fetch Website",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        680,
        300
      ],
      "parameters": {
        "url": "={{$json[\"base_domain\"]}}/blog/category/release",
        "options": {
          "timeout": 10000
        },
        "responseFormat": "string"
      },
      "typeVersion": 1
    },
    {
      "name": "Set URL",
      "type": "n8n-nodes-base.set",
      "position": [
        460,
        300
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "base_domain",
              "value": "https://baserow.io"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "name": "Complete Link",
      "type": "n8n-nodes-base.set",
      "position": [
        240,
        500
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "link",
              "value": "={{$item(0).$node[\"Set URL\"].json[\"base_domain\"]}}{{$json[\"link\"]}}"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "name": "Format Date",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        460,
        500
      ],
      "parameters": {
        "value": "={{$json[\"date\"]}}",
        "options": {},
        "toFormat": "YYYY-MM-DD",
        "dataPropertyName": "date"
      },
      "typeVersion": 1
    },
    {
      "name": "Create RSS Items",
      "type": "n8n-nodes-base.functionItem",
      "position": [
        680,
        500
      ],
      "parameters": {
        "functionCode": "return {\n  rss_item: \n`<item>\n  <title>${item.title}</title>\n  <link>${item.link}</link>\n  <description>${item.description}</description>\n  <pubDate>${item.date}</pubDate>\n</item>`\n}"
      },
      "typeVersion": 1
    },
    {
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        240,
        100
      ],
      "parameters": {
        "path": "baserow-releases",
        "options": {},
        "responseMode": "responseNode"
      },
      "typeVersion": 1
    },
    {
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1120,
        500
      ],
      "parameters": {
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "content-type",
                "value": "application/xml"
              }
            ]
          }
        },
        "respondWith": "text",
        "responseBody": "={{$json[\"feed\"]}}"
      },
      "typeVersion": 1
    },
    {
      "name": "Prepare Response",
      "type": "n8n-nodes-base.function",
      "position": [
        900,
        500
      ],
      "parameters": {
        "functionCode": "let feed =\n`<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<rss version=\"2.0\">\n\n<channel>\n  <title>Baserow Releases</title>\n  <link>https://baserow.io/blog/category/release</link>\n  <description>Stay up to date with the latest changes and updates of Baserow</description>\n  ${items.map(e => e.json.rss_item).join('\\n')}\n</channel>\n\n</rss>`;\n\nreturn [{\n  json: {\n    feed: feed\n  }\n}];"
      },
      "typeVersion": 1
    },
    {
      "name": "Extract Fields",
      "type": "n8n-nodes-base.htmlExtract",
      "position": [
        1340,
        300
      ],
      "parameters": {
        "options": {},
        "dataPropertyName": "post",
        "extractionValues": {
          "values": [
            {
              "key": "date",
              "cssSelector": ".blog-listing__post-info > strong"
            },
            {
              "key": "title",
              "cssSelector": ".blog-listing__post-title"
            },
            {
              "key": "link",
              "attribute": "href",
              "cssSelector": ".blog-listing__post-title > a",
              "returnValue": "attribute"
            },
            {
              "key": "description",
              "cssSelector": ".blog-listing__post-description"
            }
          ]
        }
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Set URL": {
      "main": [
        [
          {
            "node": "Fetch Website",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Set URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Item Lists": {
      "main": [
        [
          {
            "node": "Extract Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Date": {
      "main": [
        [
          {
            "node": "Create RSS Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Complete Link": {
      "main": [
        [
          {
            "node": "Format Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Posts": {
      "main": [
        [
          {
            "node": "Item Lists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Website": {
      "main": [
        [
          {
            "node": "Extract Posts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Fields": {
      "main": [
        [
          {
            "node": "Complete Link",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create RSS Items": {
      "main": [
        [
          {
            "node": "Prepare Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Response": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On clicking 'execute'": {
      "main": [
        [
          {
            "node": "Set URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

Easily generate a custom RSS feed from any website's content, saving you time on manual aggregation and ensuring you never miss updates from sources without built-in feeds. This workflow suits content curators, bloggers, or teams monitoring niche sites, delivering structured XML output ready for syndication or import into tools like Feedly. The key step involves using the htmlExtract node to pull articles, titles, and dates from the fetched HTML via httpRequest, transforming raw web data into feed-ready items.

Use this when scraping dynamic sites like news portals or forums for personal feeds, especially if they lack official RSS. Avoid it for sites with anti-scraping measures or high-traffic needs, where legal compliance or dedicated APIs might be better. Common variations include filtering by keywords in the functionItem node or scheduling via cron for automated updates.

About this workflow

Create An Rss Feed Based On A Website S Content. Uses manualTrigger, itemLists, htmlExtract, httpRequest. Event-driven trigger; 12 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

extract_swifts. Uses manualTrigger, httpRequest, htmlExtract, splitInBatches. Event-driven trigger; 23 nodes.

HTTP Request, Html Extract, MongoDB +5
Web Scraping

Pulling Data From Services That N8N Doesnt Have A Pre Built Integration For. Uses manualTrigger, stickyNote, itemLists, htmlExtract. Event-driven trigger; 14 nodes.

Item Lists, Html Extract, HTTP Request
Web Scraping

Workflow 1748. Uses itemLists, htmlExtract, httpRequest. Event-driven trigger; 14 nodes.

Item Lists, Html Extract, HTTP Request
Web Scraping

Rss Feed For Ard Audiothek Podcasts. Uses manualTrigger, httpRequest, htmlExtract, itemLists. Event-driven trigger; 11 nodes.

HTTP Request, Html Extract, Item Lists
Web Scraping

This workflow adds a new product in Stripe whenever a new product has been added to Pipedrive. Stripe account and Stripe credentials Pipedrive account and Pipedrive credentials Pipedrive trigger node

Pipedrive Trigger, Function Item, HTTP Request +1