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 & and & 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 see | What happened | What to do |
|---|---|---|
| “N sitemaps were not read: the free extractor reads 5 per run.” | Only five files were read, nested ones included | Run 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 many | Run 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 element | See 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,000 | The 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 read | Open 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.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.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.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.Remove duplicates: Data → Data cleanup → Remove duplicates in Google Sheets, or Data → Remove Duplicates in Excel.
| Generator | Index | Child files | URLs 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.xml | Up to 2,000, so one full file is more than the extractor returns |
| Yoast SEO | /sitemap_index.xml | post-sitemap.xml, post-sitemap2.xml, page-sitemap.xml, category-sitemap.xml, post_tag-sitemap.xml, author-sitemap.xml | 1,000 by default; only the wpseo_sitemap_entries_per_page filter changes it |
| Rank Math | /sitemap_index.xml | The same naming as Yoast SEO | 200 by default, set under Rank Math SEO → Sitemap Settings → General → Links Per Sitemap |
| SEOPress | /sitemaps.xml | One file per post type and taxonomy, listed in the index | Open 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.
| Pattern | What it usually is | Where to fix it |
|---|---|---|
| An attachment-sitemap.xml child, or addresses ending in an image’s name | Attachment pages: one thin page per uploaded file | Yoast 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 author | An author archive that repeats the blog index | Yoast SEO → Settings → Advanced → Author archives; Rank Math SEO → Titles & Meta → Authors; SEOPress: SEO → Titles & Metas → Archives |
| Hundreds of /tag/ URLs | Tags used once each, as in the example above | Yoast SEO → Settings → Categories & tags; Rank Math SEO → Sitemap Settings → Tags; SEOPress: SEO → XML - HTML Sitemap → Taxonomies |
| Slugs ending in -2 or -3 | A second copy of a post, often from an import or a duplicated draft | Compare with the original, then delete the copy or redirect it to the original |
| /sample-page/ or /hello-world/ | WordPress’s starter content, never deleted | Delete both |
| A section you did not know existed, such as /portfolio/ or /testimonial/ | A post type a theme or plugin registered as public | Decide 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 address | Run 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.Extract every child sitemap as above and save the list with the date. This is your old-URL column.
- 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.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.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.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.
Finding pages with no internal links
Your sitemap lists every page you want found. Your internal links decide which pages a visitor, and Googlebot following links, can actually reach. A page on the first list but missing from the second is an orphan: Google can find it through the sitemap, but your own site gives it no links and no context.
- 1.Put the full sitemap list in column A.
- 2.In Search Console, open Links and, under Internal links, open the full Top linked pages table and export it. Put those target pages in column B.
- 3.Make both columns use the same form of address: the same protocol, the same www or non-www, and the same trailing slash. One mismatch makes every row look orphaned.
- 4.In column C, enter =COUNTIF(B:B, A2)=0 and fill it down. TRUE marks a sitemap URL missing from that table. The table is a sample capped at 1,000 rows, not every link Google knows, so treat TRUE as a lead.
- 5.Check those pages in WordPress. Yoast SEO’s text link counter adds a column to the Posts screen with the number of internal links pointing at each post, and Rank Math’s Link Counter shows link counts on the same screen. A zero confirms it.
The Links report reflects Google’s last crawl, so a link you added this week may not show yet. The internal link checker here reaches 12 pages from one start URL, which makes it right for checking the links on your key pages, not for finding orphans across a whole site.
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.
| Symptom | Likely cause | What to try |
|---|---|---|
| Type Not an XML sitemap, with the “did not look like an XML sitemap” warning | The 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 address | A gzip file is binary, and the extractor reads plain XML only | Enter the uncompressed address; WordPress generators serve plain XML |
| Not an XML sitemap on a .txt address | A 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 0 | An empty file, or <loc> values wrapped in CDATA or written with a namespace prefix, which the extractor skips | Open the file. If it really is empty, turn that post type off in the sitemap settings. |
| Fewer URLs than expected from an index | The five-file limit, the URL cap, or a child that failed | Child sitemap files shows which: each child is marked with the URLs it added, its error, or Not read. |
| The whole run fails | The 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 URL | Percent-encoded letters are normal: WordPress stores non-English slugs that way. Character references such as é 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.