Free SEO Tools

Sitemap URL Extractor

Extract clean page URLs from public XML sitemaps and sitemap index files for audits and migrations.

Sitemap summary

Extract a clean URL list from an XML sitemap.

Extracted URLs
Complete the form to generate output.

What the extractor reads and returns

Enter the address of an XML sitemap or a sitemap index. The extractor downloads it, decides which of the two it is by looking for a <urlset> or a <sitemapindex> element, and pulls out the value of every <loc> tag, with character references such as &amp; and &#38; decoded. Exact duplicates are removed, and the result lands in the Extracted URLs box, one URL per line, ready to paste into a spreadsheet, a crawler or a redirect plan.

For a sitemap index, it reads up to five child sitemaps in the order the index lists them, one after another, and merges their URLs. A child that is itself an index has its sitemaps read too, within the same five files. A child that fails is reported and skipped, and the others still count. Either way, the output stops at 1,000 URLs, and a warning says when it did.

Limits, from the code

  • 1.4 MB per file. A bigger file at the address you entered stops the run with “The response is too large for this free check.” A bigger child is reported and skipped.
  • About 9 seconds per file and up to four redirects. A slower server gets “The website took too long to respond.”
  • Five child sitemaps from an index, in the order listed, nested ones included.
  • 1,000 URLs in the output.
  • Only http and https addresses are kept. Anything else inside a <loc> tag is dropped.

It is a list tool, not a validator. It does not check that the XML is well-formed, that the URLs load or that robots.txt names the sitemap. The sitemap checker does that, on a sample of ten URLs; this guide is about what to do with the full list.

Reading the summary panel

Type says what the extractor detected: Sitemap (urlset) for a plain sitemap of pages, Sitemap index (sitemapindex) for an index of other sitemaps, or Not an XML sitemap when the response held neither. Final URL after redirects appears when the address you entered redirected. URLs found is the number of lines in the output box after duplicates are removed. Child sitemaps counts every child the index lists, including any that were not read. Child sitemap files lists each one with what happened to it: the URLs it added, its HTTP error, Not read, or where it redirected.

What you seeWhat happenedWhat to do
“N sitemaps were not read: the free extractor reads 5 per run.”Only five files were read, nested ones includedRun the children marked Not read one at a time
“Output was capped at 1,000 URLs.”A child pushed the total to 1,000, and the files after it were skipped; a second warning says how manyRun the children marked Not read one at a time
“The response did not look like an XML sitemap or sitemap index.”The response contained neither root elementSee the troubleshooting table below
“This sitemap lists N URLs. Output was capped at the first 1,000.”A plain sitemap with more than 1,000 entries was cut at 1,000The list is incomplete. A WordPress core sitemap file can hold 2,000; see the next section.
“… returned HTTP 404, so its URLs are missing.” or “… could not be loaded …”A child sitemap failed. The other files were still readOpen the child in a browser. A post type that was switched off, or a plugin that stopped building that file, is the usual cause.

One case is silent: a URL listed in two child files appears once.

Getting every URL from a large site

Because of the 1,000-URL cap, the reliable way through a large sitemap is file by file. Each WordPress generator splits its sitemap at a known size, which tells you whether one child file fits under the cap.

  1. 1.Run the index first: Child sitemap files lists every child address and marks the ones it did not read. Or open the index in your browser; all four generators show it as a readable list.
  2. 2.Run each child on its own. A Yoast SEO or Rank Math child always fits under the cap. A full core file does not: open it in the browser and save it, or lower the file size with the wp_sitemaps_max_urls filter.
  3. 3.Paste each result into one spreadsheet column, one file after another, and note the file name in the next column. It tells you later which post type or taxonomy a URL came from.
  4. 4.Remove duplicates: Data → Data cleanup → Remove duplicates in Google Sheets, or Data → Remove Duplicates in Excel.
GeneratorIndexChild filesURLs per child file
WordPress core/wp-sitemap.xml/wp-sitemap-posts-post-1.xml, then -2, -3; /wp-sitemap-posts-page-1.xml; /wp-sitemap-taxonomies-category-1.xml; /wp-sitemap-users-1.xmlUp to 2,000, so one full file is more than the extractor returns
Yoast SEO/sitemap_index.xmlpost-sitemap.xml, post-sitemap2.xml, page-sitemap.xml, category-sitemap.xml, post_tag-sitemap.xml, author-sitemap.xml1,000 by default; only the wpseo_sitemap_entries_per_page filter changes it
Rank Math/sitemap_index.xmlThe same naming as Yoast SEO200 by default, set under Rank Math SEO → Sitemap Settings → General → Links Per Sitemap
SEOPress/sitemaps.xmlOne file per post type and taxonomy, listed in the indexOpen the index to see how it splits

Worked example: a 3,400-post Yoast site, file by file

Illustrative values. A recipe blog on Yoast SEO has about 3,400 posts, 40 pages, 25 categories and 600 tags. Its index lists post-sitemap.xml to post-sitemap4.xml, then page-sitemap.xml, category-sitemap.xml and post_tag-sitemap.xml: seven children.

Run 1: the index

Type: Sitemap index (sitemapindex) · URLs found: 1000 · Child sitemaps: 7 · Warnings: Output was capped at 1,000 URLs. 6 sitemaps were not read because of the URL cap. Run them on their own.

The first child, post-sitemap.xml, already holds 1,000 posts, so the run stopped after one file. All 1,000 URLs are that file’s posts.

Runs 2 to 4: post-sitemap2.xml to post-sitemap4.xml

Type: Sitemap (urlset) · URLs found: 1000, then 1000, then 400

A Yoast child holds at most 1,000 URLs, so a full file returns exactly 1,000 and nothing is missing.

Runs 5 to 7: pages, categories and tags

Type: Sitemap (urlset) · URLs found: 40, then 25, then 600

Six hundred tag archives for 3,400 posts is the finding.

Seven runs gave 4,065 URLs. Under Posts → Tags in WordPress, sorting by the Count column showed 410 tags with a single post each: 410 near-empty archive pages listed for Google. The owner turned off Show tags in search results under Yoast SEO → Settings → Categories & tags, which noindexes the tag archives and drops post_tag-sitemap.xml from the index. A re-run of the index then showed six children.

URLs that should not be in the list

A sitemap is your site telling Google which URLs matter. URLs that do not belong there come in groups that share a pattern, so sort the column alphabetically and scan for these.

PatternWhat it usually isWhere to fix it
An attachment-sitemap.xml child, or addresses ending in an image’s nameAttachment pages: one thin page per uploaded fileYoast SEO → Settings → Advanced → Media pages (off by default); Rank Math SEO → General Settings → Links → Redirect Attachments. WordPress 6.4 and later turns attachment pages off on new installs.
/author/name/ on a site with one authorAn author archive that repeats the blog indexYoast SEO → Settings → Advanced → Author archives; Rank Math SEO → Titles & Meta → Authors; SEOPress: SEO → Titles & Metas → Archives
Hundreds of /tag/ URLsTags used once each, as in the example aboveYoast SEO → Settings → Categories & tags; Rank Math SEO → Sitemap Settings → Tags; SEOPress: SEO → XML - HTML Sitemap → Taxonomies
Slugs ending in -2 or -3A second copy of a post, often from an import or a duplicated draftCompare with the original, then delete the copy or redirect it to the original
/sample-page/ or /hello-world/WordPress’s starter content, never deletedDelete both
A section you did not know existed, such as /portfolio/ or /testimonial/A post type a theme or plugin registered as publicDecide whether those pages should be indexed at all, then turn the post type off in your SEO plugin’s sitemap settings
A different host, such as staging. or http://A sitemap built from an old site addressRun the sitemap checker on that file; it shows which setting is behind it

Thank-you pages, ad landing pages and members-only pages are the other common case. Set them to noindex in your SEO plugin’s box on that page (the Advanced tab in Yoast SEO, Rank Math and SEOPress), then re-run the file to confirm they left the sitemap. A page cache or CDN may serve the old file for a while.

Worked example: a redirect map before a URL change

The best moment to run the extractor is before you change URLs: a new permalink structure, moving posts out of /blog/, a domain change, or a shop that drops /product/ from its addresses. Once the change goes live, the old sitemap is gone, and with it the easiest record of every address Google knows.

  1. 1.Extract every child sitemap as above and save the list with the date. This is your old-URL column.
  2. 2.Add addresses Google knows that the sitemap does not list. In Search Console, Performance → Pages, set the date range to the longest available and export it.
  3. 3.Make the change on a staging copy, extract its new sitemap, and put each new URL next to its old one. When only the structure changes, sorting both lists by the last part of the path lines most rows up.
  4. 4.Load the pairs into a redirect manager. The free Redirection plugin imports a CSV with the source URL in the first column and the target in the second, under Tools → Redirection → Import. Do not rely on WordPress to guess where an old address went.
  5. 5.After launch, test old URLs in the redirect checker. Each should return one 301 straight to its new address, with no chain.

One row of the map (illustrative)

Before: https://example.com/2023/04/sourdough-starter/

After: https://example.com/sourdough-starter/

A date-based structure moved to post name only. The slug is the same, so the rows pair up by sorting.

Comparing the list with what Google indexed

The sitemap is your list of pages. Search Console’s Page indexing report is Google’s. Comparing the two shows which listed pages Google chose not to index, and which indexed pages you never listed.

In Search Console, open Indexing → Pages. The filter above the chart switches between All known pages, All submitted pages and Unsubmitted pages only. Choose All submitted pages to limit the report to URLs from your sitemaps, open each reason under Why pages aren’t indexed, and export its examples.

Each export holds at most 1,000 example URLs (as of October 2026), so on a larger site the extracted list is the complete one and the export is a sample. Match them in a spreadsheet the same way as the orphan check, then read the reasons that matter.

Listed, but Crawled – currently not indexed

Google fetched the page and decided not to index it, usually because it adds little beyond pages it already has.

Improve the page, merge it into a stronger one, or take it out of the sitemap if it was never meant to rank.

Listed, but Discovered – currently not indexed

Google knows the URL but has not crawled it yet.

Common on new or large sites. Internal links from pages Google already crawls often move these along.

Indexed, but not in the sitemap

Switch the filter to Unsubmitted pages only. These are pages Google indexed from links alone.

Either add the pages to the sitemap, or ask why they exist: parameter URLs, attachment pages and old archives show up here.

When the extraction fails or looks wrong

The extractor shows little about the files it fetched, so most problems show up as a wrong count or a wrong type. Work from the symptom.

SymptomLikely causeWhat to try
Type Not an XML sitemap, with the “did not look like an XML sitemap” warningThe address returned an HTML page: a 404 page, a login or maintenance page, or a firewall challenge. When the status was 400 or higher, a warning such as “The sitemap URL returned HTTP 404.” comes first.Open the address in a private browser window to see what it returns
Not an XML sitemap on a .gz addressA gzip file is binary, and the extractor reads plain XML onlyEnter the uncompressed address; WordPress generators serve plain XML
Not an XML sitemap on a .txt addressA text sitemap, one URL per line. Google accepts these; this tool reads XML only.Open the file: it already is the list
Type Sitemap (urlset), URLs found 0An empty file, or <loc> values wrapped in CDATA or written with a namespace prefix, which the extractor skipsOpen the file. If it really is empty, turn that post type off in the sitemap settings.
Fewer URLs than expected from an indexThe five-file limit, the URL cap, or a child that failedChild sitemap files shows which: each child is marked with the URLs it added, its error, or Not read.
The whole run failsThe address you entered could not be loaded or was over 1.4 MB. A child that fails does not stop the run; it is listed under Child sitemap files.Open the address in a browser. A plugin that builds sitemaps on request may answer a second try faster, from its cache.
“… is a sitemap index inside a sitemap index.”A child was itself a sitemap index. Its sitemaps were read within the five-file limit, not listed as pages. Google does not support nested indexes.Have one index list every file directly
Odd sequences such as %C3%A9 in a URLPercent-encoded letters are normal: WordPress stores non-English slugs that way. Character references such as &#233; are decoded, so they show as the letter.Read them as the character they stand for before you match URLs in a spreadsheet

What the list does not tell you

The list is what the sitemap claims, not proof that the URLs work. It shows no status codes, redirects, noindex tags or canonicals. The sitemap checker tests a sample of ten for those, and the indexability checker tests one URL in depth.

It leaves out image and video entries (image:loc and similar extension tags), hreflang alternates written as xhtml:link, and every lastmod date. They are still in the file; open it in a browser if you need them.

It cannot show pages the sitemap leaves out. Posts set to noindex, post types switched off in your SEO plugin and products hidden from the catalog are missing by design. To find those, compare the list with a crawl or with Search Console, as above.

FAQ about the Sitemap Extractor

Can this extract sitemap indexes?

Yes. It reads the index, then up to five child sitemaps in the order listed, nested indexes included, and stops at 1,000 URLs. The summary lists every child and marks the ones it did not read, so you know which to run one at a time.

Is this the same as a crawler?

No. It lists the URLs a sitemap declares. A crawler discovers URLs by following links, so it also finds pages the sitemap leaves out, and it misses pages nothing links to. Each shows something the other cannot.

Why did I get exactly 1,000 URLs?

That is the output cap, and a warning says when it cut the list: “Output was capped at 1,000 URLs.” from an index, or “This sitemap lists N URLs.” from a single file. With no warning, the file held exactly 1,000, as a full Yoast SEO child does. A WordPress core sitemap file can hold 2,000.

Can it read .gz sitemaps?

No. A gzip file is binary and comes back as Not an XML sitemap, so enter the uncompressed address. Servers that compress responses on the fly for transfer are fine; only .gz files fail.

Why are my image URLs missing?

The extractor reads only plain <loc> tags, which hold page addresses. Image entries use image:loc, which it skips, so the list stays a list of pages.

Can I extract another site’s sitemap?

Yes, if it is public. The site’s robots.txt usually names it on a Sitemap: line. It is a quick way to see how another site is organized: which post types it publishes, and roughly how many of each.

Can I submit this list to Google?

Not as a list. Google reads sitemaps, so submit the sitemap itself under Indexing → Sitemaps in Search Console. Request indexing in URL Inspection works one URL at a time with a daily limit, so save it for a few important pages.