import { Image } from "astro:assets";
import sitemapSource from "../../assets/screenshots/article-sitemap-source.png";
import savePageRendered from "../../assets/screenshots/article-save-page-rendered.png";
import seoInventory from "../../assets/screenshots/article-seo-inventory.png";

To export title tags and meta descriptions from an XML sitemap, use the sitemap as the URL source, visit each selected page, save its HTML, and export the captured metadata as CSV. In [Tab Automation](/), that sequence is **For Each Link → Sitemap → Save Page**.

The export also includes headings, canonical declarations, robots directives, language, social tags, and declared structured-data types. It is useful for a content inventory, template check, migration review, or a first look at a section of a site. It does not grade the pages or decide what should be indexed.

This walkthrough uses a dated five-page product fixture built from current metadata for URLs in `https://tabautomation.app/sitemap.xml` on 18 September 2026. It demonstrates the real controls and result shape; it is not a live crawl report. Start with a similarly small sample before visiting a large sitemap.

## Use the sitemap as the page list

You’ll need Tab Automation installed and an active [Launch License](/blog/launch-license). Open a regular page from the site you want to inspect, then:

1. Open the Tab Automation side panel and choose **New Automation**.
2. Under **Select a Tab**, turn off **Always start this automation in a new tab** and select the open page.
3. Choose **Add Step → For Each Link**.
4. Select **Sitemap**, enter the public sitemap URL, and choose **Collect links**.
5. Review the collected pages before adding the capture step.

For a first pass, use **Limit how many** or open **URL filters** and set an allowed hostname or path prefix such as `/blog/`. Filters apply before the limit. A child sitemap is another good boundary when a sitemap index covers several page types.

<figure style="margin: 1.5rem 0;">
  <a href={sitemapSource.src}>
    <Image
      src={sitemapSource}
      alt="For Each Link configured with the Tab Automation XML sitemap and a five-link limit."
      loading="lazy"
      style="display: block; max-width: 100%; height: auto; border-radius: 12px;"
    />
  </a>
  <figcaption style="margin-top: 0.65rem; color: var(--secondary); font-size: 0.875rem; line-height: 1.5;">
    A five-page sample keeps the first run easy to verify. Open the full-size image for the exact
    fields.
  </figcaption>
</figure>

The sitemap source accepts public UTF-8 XML page sitemaps and sitemap indexes, including gzip-compressed files and nested indexes within the documented limits. It collects absolute HTTP(S) URLs from `url/loc` entries. It does not accept an uploaded sitemap, pasted XML, an HTML sitemap, a plain-text URL file, or a sitemap that requires credentials. The [For Each Link reference](/steps/for-each-link#collect-from-a-sitemap) lists the supported formats and limits.

## Add Save Page inside Each Link

Add [Save Page](/steps/save-page) inside **Each Link**. Saving the page retains an HTML result and automatically creates a metadata record from that same HTML.

Choose the mode based on what you need to inspect:

| Capture mode      | Use it when                                                                                               |
| ----------------- | --------------------------------------------------------------------------------------------------------- |
| **Source HTML**   | You want the HTML returned by a fresh request for the current URL. It can differ from the first response. |
| **Rendered HTML** | JavaScript changes the title, description, canonical, robots tag, headings, or other page content.        |

Rendered mode records the current main-document DOM after the page loads and after earlier interaction steps have run. Under **Advanced**, an optional CSS selector can hold the step until an expected element exists; an extra delay can allow late content to settle. A readiness timeout fails instead of quietly saving early.

<figure style="margin: 1.5rem 0;">
  <a href={savePageRendered.src}>
    <Image
      src={savePageRendered}
      alt="Save Page configured for Rendered HTML with the main selector, a short delay, and a readiness timeout."
      loading="lazy"
      style="display: block; max-width: 100%; height: auto; border-radius: 12px;"
    />
  </a>
  <figcaption style="margin-top: 0.65rem; color: var(--secondary); font-size: 0.875rem; line-height: 1.5;">
    Rendered HTML is useful when page JavaScript changes the declarations you want to inspect.
  </figcaption>
</figure>

For a server-rendered site whose metadata is already in its response, Source HTML is the simpler choice. Google also distinguishes the original response from the final HTML after scripts run in its guide to [viewing rendered source](https://support.google.com/webmasters/answer/11626894).

Rendered HTML is not a complete offline archive. Linked images, stylesheets, scripts, and fonts remain external, and iframe documents, shadow DOM, canvas pixels, and live form properties are not reconstructed.

## Run one pass

1. Keep [Repeat](/steps/repeat) **off** in the End block so the automation walks the sitemap selection once.
2. Add [Wait / Delay](/steps/wait-delay) inside Each Link before Save Page if the site needs more time per destination.
3. Choose **Save & Run** and keep Chrome open.
4. Watch the automation row or [Activity](/steps/activity) for page and step failures.

Each collected URL opens in the same assigned tab. The next URL starts after the inner steps finish. A run does not open all pages in separate tabs, and the sitemap is fetched again when the run starts.

If one sitemap in a nested index fails to load or parse, collection stops rather than visiting a partial list. If an individual page fails later, check the run before treating the export as complete.

## Review and export the metadata

When the run finishes, open **Dashboard → Saved Pages & SEO**. Start with **Runs** and open the sitemap run, or use **Domains** to narrow the inventory to a hostname and run.

The table shows the source URL, first title, first meta description, and first H1. Open a page for all captured declarations, including additional titles or descriptions, H2–H6 headings, canonical values, robots and Googlebot directives, language, Open Graph and Twitter tags, and declared JSON-LD, microdata, or RDFa types.

<figure style="margin: 1.5rem 0;">
  <a href={seoInventory.src}>
    <Image
      src={seoInventory}
      alt="Saved Pages and SEO table containing five Tab Automation blog URLs with title tags, meta descriptions, and first H1 values."
      loading="lazy"
      style="display: block; max-width: 100%; height: auto; border-radius: 12px;"
    />
  </a>
  <figcaption style="margin-top: 0.65rem; color: var(--secondary); font-size: 0.875rem; line-height: 1.5;">
    Dated product example using five current Tab Automation blog URLs and their metadata on 18
    September 2026.
  </figcaption>
</figure>

Choose **CSV**, then use **Export filtered** for every capture in the current view. You can instead select runs, domains, or individual pages and use **Export selected**. Export is disabled while the run is running; finish or pause it first.

The CSV has convenient first-value columns for `title`, `description`, `first_h1`, `canonical_url`, and `language`. JSON columns preserve every captured title, description, heading, canonical, robots declaration, social tag, and structured-data type. It also includes the source and final URLs, capture mode and status, timestamps, run attribution, and any inspection limitations.

## Turn the CSV into a review list

Open the CSV in your spreadsheet and keep the URL beside every finding. Useful first passes include:

- Filter blank `title`, `description`, or `first_h1` cells.
- Sort `title` and `description` to bring repeated values together.
- Compare `url` with `canonical_url` and inspect unexpected cross-page or cross-domain targets.
- Search `robots_json` for `noindex` and check whether it is intentional.
- Group URLs by template or path before deciding whether a repeated pattern is a page problem or a shared-template problem.

These are review prompts, not automatic verdicts. Tab Automation records what the captured HTML declares; it does not score lengths, identify duplicates for you, test HTTP headers, crawl internal links, or verify index coverage. A missing meta description is also not proof that a search result will have no description: Google says snippets are primarily generated from page content and may use the meta description when it better describes the page. [Google’s snippet documentation](https://developers.google.com/search/docs/appearance/snippet) explains that distinction.

Likewise, a captured `<title>` is one input rather than a promise about the displayed result. Google can also use the visible page title, headings, `og:title`, anchor text, and other signals when it generates a title link. See [Google’s title-link documentation](https://developers.google.com/search/docs/appearance/title-link).

## Know the collection boundaries

- Chrome must stay open while the automation visits pages. This is not a cloud crawler.
- Sitemap fetching does not send site credentials. Public pages that later require the browser session can still differ from what an anonymous crawler receives.
- Save Page visits URLs sequentially in one tab. Use a small child sitemap, path filter, or limit before attempting a large inventory.
- Rendered captures are limited to 16 MiB. Metadata inspection reads at most that amount, stops after 10 seconds, and retains up to 256 KiB of metadata. Partial and failed inspections stay labeled.
- Results remain local in this browser until deleted. Download the CSV or another export before uninstalling the extension or clearing its storage.
- The inventory reports HTML declarations. It does not replace Search Console data, server logs, a complete technical crawl, or Google’s selected canonical and indexing decisions.

For a list of pages discovered from search results instead of your own sitemap, use the [SERP analysis guide](/blog/serp-analysis). To collect visible product fields rather than document metadata, follow [Extract text from web pages to CSV](/blog/extract-text-web-pages-csv-chrome).

_Editorial note: Written with AI assistance and checked against the extension source, its automated contracts, and the primary documentation linked above._
