---
title: "Scrape Webflow with Claude | EnConvert"
description: "Scrape Webflow pages into a Claude pipeline with EnConvert Perceive, returning clean Markdown with navigation and sidebars stripped in a single batch call"
canonical: "https://www.enconvert.com/solutions/scrape-webflow-with-claude-enconvert"
locale: "en"
---

# How to Scrape Webflow with Claude

A developer building a Claude pipeline that reads Webflow pages needs clean page text before passing it into Claude. Webflow pages mix article content with navbar links, cookie consent banners, CMS collection list items, sticky headers, Lottie animation overlays, pricing toggle sections, footer link columns, pop-up modals, and form submission blocks, and scraping them by hand requires CSS selectors that break when Webflow updates its layout. EnConvert Perceive renders up to 10 Webflow pages in a single batch call and returns clean Markdown for each, with navigation and sidebars stripped by default. The extracted Markdown is ready to pass to Claude via the Anthropic SDK with no HTML parsing.

## Example

```python
import os

import anthropic
import requests

BASE_URL = "https://api.enconvert.com/v2"
headers = {
    "X-API-Key": os.environ["ENCONVERT_API_KEY"],
    "Content-Type": "application/json",
}

page_urls = [url.strip() for url in os.environ["WEBFLOW_PAGE_URLS"].split(",")]  # public Webflow page URLs

if len(page_urls) > 10:
    raise ValueError("This example covers inline batches of 10 URLs or fewer")

response = requests.post(f"{BASE_URL}/perceive/batch", headers=headers,
    json={"urls": page_urls, "options": {"outputs": ["markdown"]}}, timeout=300)

if response.status_code == 402:
    raise RuntimeError("Monthly ops allowance exhausted")
response.raise_for_status()

pages = []
for result in response.json()["items"]:
    page_url = result["url"]
    if result.get("status") != "completed":
        print(f"Skipped {page_url}: {result.get('status')}")
        continue
    if result.get("is_blocked"):
        print(f"Skipped {page_url}: blocked page")
        continue
    render_quality = result.get("render_quality", 1.0)
    if render_quality < 0.40:
        print(f"Skipped {page_url}: low render quality ({render_quality:.2f})")
        continue
    markdown_url = result["outputs"]["markdown"]["url"]
    markdown = requests.get(markdown_url, timeout=60)
    markdown.raise_for_status()
    pages.append(f"Source: {page_url}\n\n{markdown.text}")

if not pages:
    raise RuntimeError("No Webflow pages passed the render checks")

context = "\n\n---\n\n".join(pages)

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
message = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=4096,
    system="Answer only from the pages provided, and cite the source URL for every statement.",
    messages=[
        {"role": "user", "content": f"{context}\n\nSummarise what these Webflow pages cover and how they relate."}
    ],
)
# content is a list of typed blocks, and a thinking block can come before the text
for block in message.content:
    if block.type == "text":
        print(block.text)
```

## Output

Perceive returns clean Markdown for each URL in the batch, with navigation and sidebars stripped by default, delivered as pre-signed URLs that you fetch once per page. Passing raw Webflow HTML to Claude fills the context window with navbar markup, cookie banners, CMS list items, and other page furniture, and scraping Webflow by hand needs CSS selectors that break when the layout changes.

## Get started

[Get free API key — 500 ops per month, no card required.](https://www.enconvert.com/auth?mode=signup)

## Related solutions

- [How to Scrape Wikipedia with LlamaIndex](https://www.enconvert.com/solutions/scrape-wikipedia-with-llamaindex-enconvert.md)
- [How to Ingest Markdown into LangChain with EnConvert](https://www.enconvert.com/solutions/ingest-markdown-into-langchain-with-heading-context.md)
- [Best JigsawStack Alternative for Structured Data Extraction](https://www.enconvert.com/solutions/jigsawstack-alternative-for-structured-data-enconvert.md)
- [How to Ingest Audio Transcripts into Qdrant with EnConvert](https://www.enconvert.com/solutions/ingest-audio-transcripts-into-qdrant-enconvert-api.md)
- [How to Ingest a CSV into pgvector Without Losing Row Context](https://www.enconvert.com/solutions/ingest-csv-into-pgvector-with-row-context-enconvert-api.md)
- [How to Ingest CSV into CrewAI with EnConvert](https://www.enconvert.com/solutions/ingest-csv-into-crewai-with-enconvert.md)
