---
url: https://findutils.com/guides/opml-to-csv
title: "Convert an OPML Subscription Export to CSV"
description: "Flatten a Feedly, Inoreader, NetNewsWire or podcast OPML export into a spreadsheet. Learn what the columns mean, how folders are kept, and why no feed is ever fetched."
category: converters
content_type: guide
guide_type: subtopic
cluster: bookmarks
locale: en
read_time: 6
status: published
author: "olgunozoktas"
published_at: 2026-09-16T10:00:00Z
excerpt: "An OPML export is a nested XML outline that only another feed reader reads comfortably. Here is how to turn it into rows with the feed URL, the site URL and the folder path."
tag_ids: ["csv", "data-conversion", "productivity"]
tags: ["CSV", "Data Conversion", "Productivity"]
primary_keyword: "opml to csv"
secondary_keywords: ["convert opml to csv", "opml to excel", "feedly opml to csv", "rss subscriptions to spreadsheet", "podcast opml to csv", "opml viewer"]
tool_tag: "opml-to-csv"
related_tool: "opml-to-csv"
related_tools: ["opml-to-csv", "bookmarks-html-to-csv", "xml-formatter", "dedupe-bookmarks"]
og_image: "/images/content/guides/opml-to-csv-cover-20260916.webp"
image_alt: "Blank paper tags hang from a small brass branching stand beside the same tags laid flat in a compartment tray."
updated_at: "2026-09-16T10:00:00Z"
---

Convert an OPML file to CSV when you want to read, audit or share a list of feed or podcast subscriptions as rows. FindUtils [OPML to CSV](/convert/opml-to-csv/) reads the OPML export in your browser and writes one row per feed with its title, feed URL, site URL and folder path. The tool does not upload or store the file, and it never fetches a feed.

This guide explains what an OPML file holds, how the outline tree becomes rows, what each column means, and the mistakes that make a conversion fail.

## What Is an OPML File?

An OPML file is an XML outline that feed readers and podcast apps use to export and import subscription lists. OPML stands for Outline Processor Markup Language. In a subscription export, every feed is an `outline` element with an `xmlUrl` attribute pointing at its RSS or Atom feed, and every folder is an `outline` that contains other outlines. The file usually ends in `.opml`, though some apps save it as `.xml`.

Feed readers such as Feedly, Inoreader and NetNewsWire, and podcast apps that support it, offer an OPML export in their settings, account or subscriptions menu.

## What Does an OPML Export Look Like?

A small export with a nested folder looks like this:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<opml version="2.0">
  <head><title>My Feeds</title></head>
  <body>
    <outline text="Tech" title="Tech">
      <outline text="Example Blog" type="rss" xmlUrl="https://example.com/feed.xml" htmlUrl="https://example.com/"/>
      <outline text="Web">
        <outline text="CSS Weekly" type="rss" xmlUrl="https://css.example/feed"/>
      </outline>
    </outline>
    <outline text="Top Podcast" type="rss" xmlUrl="https://pod.example/feed.xml"/>
  </body>
</opml>
```

The folders are Tech and Web. The feeds are Example Blog, CSS Weekly and Top Podcast.

## How to Convert the File

Open FindUtils [OPML to CSV](/convert/opml-to-csv/), upload the `.opml` file or paste the XML, and check the preview table. Turn on Include folder rows if you also want a row for each folder. Download the CSV; keep Excel BOM on when the file will open in Excel, and turn it off if a script reads it.

The example above converts to:

```csv
title,xml_url,html_url,folder_path,description,type
Example Blog,https://example.com/feed.xml,https://example.com/,Tech,,rss
CSS Weekly,https://css.example/feed,,Tech / Web,,rss
Top Podcast,https://pod.example/feed.xml,,,,rss
```

## What Do the Columns Mean?

| Column | Source in the OPML | Content |
|---|---|---|
| title | `text`, or `title` when text is missing | The name the reader shows |
| xml_url | `xmlUrl` | The feed address a reader or podcast app subscribes to |
| html_url | `htmlUrl`, or `url` for a plain link | The website the feed belongs to |
| folder_path | The folders above the outline | Outermost folder first, joined with a slash and spaces |
| description | `description` | The feed description, when the export includes one |
| type | `type` | Usually rss; folder for folder rows |

Attribute names are matched without regard to letter case, because exports write `xmlUrl`, `xmlurl` and `XMLURL`. XML entities in titles, such as `&amp;`, are decoded.

## How Do Folders Become Rows?

Folders are carried down to every feed inside them. A feed filed under Web inside Tech gets the folder_path Tech / Web, and a feed outside any folder gets an empty folder_path. The tree is flattened into rows without losing where each feed lived.

With Include folder rows on, each folder also gets its own row, in document order, with the folder name in title, the parent path in folder_path and folder in type. The example above then has five rows: Tech, Example Blog, Web, CSS Weekly and Top Podcast.

## Feeds, Links and Folders

| Outline | How it is read |
|---|---|
| Has `xmlUrl` | A feed row |
| Has `url` but no `xmlUrl` | A link row, with the address in html_url and its type, usually link |
| Has neither, and contains outlines | A folder: its name becomes part of folder_path |
| Has neither, and contains nothing | An empty folder, written only when Include folder rows is on |

## Why Is No Feed Fetched?

No feed is fetched, because the job is to copy what the export says, not to test it. Fetching would send a request to every feed host on the list, which tells each of them what you follow and makes a large conversion slow. A feed that no longer works stays in the CSV, which is exactly what an audit needs to see.

## Practical Examples

**Auditing a feed reader.** Convert the export, sort by folder_path, and delete the feeds you no longer read before importing the trimmed list elsewhere.

**Sharing a podcast list.** A podcast app's OPML becomes a sheet with each show's title and feed URL that anyone can open.

**Checking for repeats.** Sort by html_url to spot two feeds from the same site filed under different folders.

## Common Mistakes

**Dropping a single RSS feed file.** An RSS or Atom feed is not an OPML export. It has no outline elements, so the result is No feeds found.

**Editing the XML by hand and leaving a bare &.** XML requires `&amp;`. The converter reports the problem with its line number instead of guessing.

**Expecting the CSV to import back into a reader.** Most feed readers import OPML, not CSV. Keep the original `.opml` for importing and use the CSV for review.

## Tools Used in This Guide

| Tool | Use |
|---|---|
| [OPML to CSV](/convert/opml-to-csv/) | Flatten an OPML subscription export into rows |
| [XML Formatter](/developers/xml-formatter/) | Read or repair the raw OPML before converting |
| [Bookmarks HTML to CSV](/convert/bookmarks-html-to-csv/) | Do the same for browser bookmarks |

## FAQ

### What is the difference between xml_url and html_url?

xml_url is the feed itself, the address a reader polls for new items. html_url is the website the feed belongs to. Many exports include both and some only the feed, so the CSV keeps each in its own column.

### Does OPML to CSV work with podcast exports?

Yes. A podcast app's OPML lists each show as an outline whose xmlUrl is the podcast's RSS feed, the same structure a feed reader writes, so every show becomes a row.

### Why does the converter say No feeds found?

The file has no outline with an xmlUrl or url attribute. That happens when the file is a single RSS or Atom feed, or when an export holds only empty folders.

### Is the subscription list uploaded?

No. The OPML is parsed and the CSV is written inside the browser tab, and no request carries the file or contacts a feed.

## Next Steps

Convert an export with [OPML to CSV](/convert/opml-to-csv/). For browser bookmarks, use [Bookmarks HTML to CSV](/convert/bookmarks-html-to-csv/), and remove repeats first with [Dedupe Bookmarks](/convert/dedupe-bookmarks/).
