To extract text from web pages to CSV in Chrome, use **For Each Link → Wait / Delay → Save Text → Results → CSV**. [Tab Automation](/) visits your collected product links in one assigned tab, reads the fields you picked, and retains a row for each execution. Download the dataset when the pass finishes.

This guide uses an illustrative three-product catalog with similarly structured detail pages. The names, prices, URLs, and output below are examples, not a live store test. Start with a few pages whose layout you can check before collecting a longer list. Chrome must stay open during the run.

In this guide:

- [Collect the product links](#collect-the-product-links)
- [Pick text on a sample product page](#pick-text-on-a-sample-product-page)
- [Run one pass and export CSV](#run-one-pass-and-export-csv)
- [Understand the rows and warnings](#understand-the-rows-and-warnings)
- [Fix missing fields and rerun](#fix-missing-fields-and-rerun)

## Collect the product links

1. Open your catalog listing and the Tab Automation side panel. If the panel asks for a license, follow the [Launch License instructions](/blog/launch-license) first.
2. Choose **New Automation**, select the listing tab under **Select a Tab**, and give the automation a recognizable name, such as `Catalog text`.
3. Choose **Add Step → For Each Link on Page**. Click **Pick links**, then pick one of the repeated product links. Check the collected URLs; picking also sets the listing as **Start**.
4. Use **Ignore** to exclude category links or other unwanted destinations. For a small first pass, use **Limit how many** to cap the collection at three.

If you already have the product URLs, use **Paste list**, one http(s) URL per line, in a new loop without a picked link selector. An existing selector's live matches take priority over a pasted list. The [link-walking guide](/blog/walk-through-links-in-chrome) explains collection and fallback behavior.

This recipe visits the links you collect. It does not discover every product on a website or automatically follow catalog pagination.

## Pick text on a sample product page

1. Inside **Each Link**, open **Go To This Link** and choose **Open** beside the first product URL. This opens the sample in the assigned tab while preserving the listing's Start URL.
2. Add [Wait / Delay](/steps/wait-delay) inside Each Link. Choose a **Fixed** delay, starting with five seconds and adjusting for the page's load time. This wait belongs before the text step on every product page.
3. Add [Save Text](/steps/save-text) after the wait. Click **Pick text**, then click the product name and price on the page.
4. Name the sidebar columns `Product name` and `Price`. Review the preview and column order. Names must be nonempty and unique. Click **Done** to keep the selections; **Cancel** restores the previous picking state.
5. Use **Go To This Link → Open** on a second product, then **Refresh preview** on Save Text. Check that both fields now show the second product's information. Finish picking before opening another sample.

**Check another page before running the list.** A selection that works on the first product may point to the wrong element on a different layout. Use **Reveal**, **Repick**, or **Edit selector** to inspect and adjust it, then check both products again.

**Refresh preview** reads the current sample without saving rows. **Test save** writes a separate **Test** run to Results. Use it if you want to check retained output before the full pass; keep that Test run separate from the collection you export.

## Run one pass and export CSV

1. Use **Back to Start** to return to the listing. The run collects links from Start again, so the live list can differ from your preview.
2. Turn [Repeat](/steps/repeat) **off** in the End block. This runs one pass through the collected links; the Wait inside Each Link still runs on each destination.
3. Choose **Save & Run**. Keep Chrome open while the automation visits each product in the same tab.
4. When the pass finishes, click **Dashboard** in the side-panel header to open Results. Choose **Datasets** and open the text dataset from your `Catalog text` run.
5. Review its rows and warnings, then click **CSV**. Export is blocked while the run is running; finish the pass or pause it to export the rows already saved.

The CSV is a downloaded file you can import into a spreadsheet. There is no direct Google Sheets connection or ongoing spreadsheet synchronization. **JSON** and **MARKDOWN** are also available for the dataset.

## Understand the rows and warnings

An illustrative export could contain these rows. The empty price cell is intentional; the warning explains why it was not collected.

| Source URL                         | Product name  | Price  | Saved at                 | Warnings                             |
| ---------------------------------- | ------------- | ------ | ------------------------ | ------------------------------------ |
| https://example.com/products/mug   | Stoneware mug | $19.95 | 2026-09-12T03:00:05.000Z |                                      |
| https://example.com/products/bowl  | Serving bowl  | $29.95 | 2026-09-12T03:00:12.000Z |                                      |
| https://example.com/products/plate | Dinner plate  |        | 2026-09-12T03:00:19.000Z | Price: Element is missing or hidden. |

**Save Text creates one row each time the step executes.** Picking two fields creates two columns in that row. It does not turn every product card on a listing into its own row; this recipe gets separate rows by visiting separate detail pages.

Prices remain displayed text, including currency symbols. The exporter adds **Source URL**, **Saved at**, and **Warnings** alongside your named columns; you do not need to pick those fields. CSV timestamps use UTC. Missing or hidden selected elements leave blank cells with warnings rather than reusing the previous product's value.

One Save Text step collects a dataset for that run. Separate Save Text steps create separate datasets, and a new run starts a new dataset. The step does not write to [Values](/steps/values); [Save Value](/steps/save-value) is the separate control for passing a value to another step.

## Fix missing fields and rerun

If a field is blank, open that product as a sample and refresh the preview. Confirm the field exists, is visible, and matches the saved selection. If it arrives late, increase the inner delay or configure a **Wait Until** for the relevant element before Save Text. A longer wait cannot repair a selector that points to the wrong element.

Before deliberately collecting the same links again, review **Skip visited**. The default **Timed** setting remembers visits for 24 hours. Use **Clear … remembered** to clear the visit history for a fresh pass, or select **Always** to visit remembered URLs too. In the current control, **Never** means never revisit remembered URLs. Keep Repeat off when you want only one new pass.

Results stay local in this browser until deleted. Export a copy you want to keep independently: uninstalling the extension or clearing its storage removes retained Results.

For the matching product pictures, follow [Download images from multiple pages in Chrome](/blog/download-images-multiple-pages-chrome). You can put Save Text and Save Images inside the same Each Link loop, then export the run as a ZIP containing its datasets and files.

_Editorial note: This guide was drafted with AI assistance and checked against the extension source and existing test cases. The catalog and output are illustrative._
