---
seo_title: Loader LangChain per Pagine Web e Crawling di Siti | EnConvert
meta_desc: Installa langchain-enconvert per convertire pagine web e siti interi in LangChain Documents per pipeline RAG, con punteggi render_quality su ogni pagina.
keywords: loader documenti langchain, loader pagina web langchain, crawling siti langchain, perceive url langchain, ingest langchain, enconvert langchain, langchain-enconvert, pipeline rag langchain, punteggio qualità perceive langchain
---

# Loader LangChain per Pagine Web e Crawling di Siti

Il loader EnConvert per [LangChain](https://www.langchain.com) converte le pagine web e i siti interi in LangChain `Document`s. Percepisci i singoli URL in markdown o esplora un intero sito e restituisci un Document per chunk pronto per RAG. Ogni rendering della pagina ha un punteggio `render_quality` (0,0–1,0) nei suoi metadati, quindi una pagina bloccata o vuota è segnalata anziché essere silenziosamente considerata attendibile.

<div class="alert alert-info">
<strong>Pacchetto:</strong> <code>langchain-enconvert</code> · <strong>Fonte:</strong> <a href="https://github.com/enconvert/langchain-enconvert">enconvert/langchain-enconvert</a> · <strong>Richiede:</strong> <code>langchain-core>=0.3</code> · <strong>Licenza:</strong> MIT
</div>

---

## Installazione

```bash
pip install langchain-enconvert
```

---

## Aggiungi la tua chiave API

Il loader richiede una credenziale: **Chiave API EnConvert**.

```python
from langchain_enconvert import EnconvertLoader

loader = EnconvertLoader(api_key="sk_...")
# Oppure imposta $ENCONVERT_API_KEY e ometti il parametro
loader = EnconvertLoader()
```

Genera una chiave API **privata** nel [dashboard](/dashboard/api-keys). Le chiavi private iniziano con `sk_`. Le chiavi pubbliche `pk_` vengono rifiutate.

<div class="alert alert-warning">
<strong>Le chiavi pubbliche non funzioneranno.</strong> Le chiavi che iniziano con <code>pk_</code> sono destinate ai widget del browser e vengono rifiutate dal loader. Scopri di più su <a href="/docs/authentication#private-keys">Private Keys</a>.
</div>

---

## Usa EnconvertLoader

Il loader supporta due modalità.

### Percepisci alcuni URL

Converti i singoli URL in `Document`s markdown:

```python
from langchain_enconvert import EnconvertLoader

loader = EnconvertLoader(urls=["https://example.com", "https://example.com/pricing"])
docs = loader.load()
```

I metadati di ogni Document contengono:
- `source`: l'URL
- `render_quality`: un numero da 0,0 (bloccato/vuoto) a 1,0 (rendering pulito)

### Esplora un sito in chunk

Esplora un intero sito e restituisci un Document per chunk di contenuto, pronto per RAG:

```python
from langchain_enconvert import EnconvertLoader

loader = EnconvertLoader(
    ingest_url="https://docs.example.com",
    mode="sitemap",  # oppure "crawl" oppure "hybrid"
    max_pages=100
)
docs = loader.load()  # Blocca fino al completamento del crawl
```

I metadati di ogni Document contengono l'URL `source` specifico del chunk, il titolo e il contesto della sezione.

Il loader esegue il polling del lavoro di ingestione fino al completamento, quindi `.load()` è sincrono. Per vero async, usa `.lazy_load()` per iterare un Document alla volta.

---

## Costruisci una pipeline RAG

Concatena il loader in uno splitter di testo e un archivio vettoriale:

```python
from langchain_enconvert import EnconvertLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

# Carica e dividi
loader = EnconvertLoader(ingest_url="https://docs.example.com", mode="sitemap")
docs = loader.load()

# Incorpora e indicizza
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
chunks = splitter.split_documents(docs)

embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)

# Query
retriever = vectorstore.as_retriever()
relevant = retriever.invoke("Come installo questo?")
```

---

## Risoluzione dei problemi

**`raise ValueError("Provide either urls or ingest_url, but not both")`**
Hai passato sia `urls=` che `ingest_url=` al loader. Scegli uno: percepisci i singoli URL o esplora un sito. Passare nessuno genera anche un errore.

**`AuthenticationError: 401 Unauthorized`**
La chiave API è scorretta o mancante. Verifica di aver impostato `api_key=` o la variabile di ambiente `$ENCONVERT_API_KEY` su una chiave **privata** (inizia con `sk_`). Le chiavi pubbliche vengono rifiutate immediatamente.

**`Il tempo di caricamento sembra molto lungo.`**
Gli crawl dei siti sono asincroni. Il loader esegue il polling fino al completamento del lavoro, che può richiedere diversi minuti su un sito grande. Per un'UX reattiva, usa l'API async (`await loader.aload()` in un contesto async) o esegui il polling diretto dello stato del lavoro tramite `/v2/ingest/{job_id}`.

**`render_quality è molto basso per le pagine che mi aspettavo di leggere correttamente.`**
Un punteggio basso (< 0,5) significa che la pagina è bloccata, vuota o ha JavaScript pesante che non è stato renderizzato in tempo. Controlla l'URL `source` grezzo in un browser per vedere cosa fornisce effettivamente la pagina. Se è un'app mono-pagina, un secondo rendering potrebbe avere successo; se è bloccato, non ci sono tentativi.

---

## Fonte e link

- **Fonte**: [enconvert/langchain-enconvert](https://github.com/enconvert/langchain-enconvert)
- **Pacchetto**: [PyPI](https://pypi.org/project/langchain-enconvert)
- **Licenza**: MIT
- **Documentazione LangChain**: [python.langchain.com](https://python.langchain.com)
- **API sottostante**: [Introduction](/docs/introduction.md)

---

## Domande frequenti

### Come carico un singolo URL in un Document?

```python
from langchain_enconvert import EnconvertLoader
loader = EnconvertLoader(urls=["https://example.com"])
docs = loader.load()
```

Il contenuto di ogni Document è il markdown della pagina e i metadati contengono l'URL `source` e il punteggio `render_quality`.

### Come esploro e indicizzo un intero sito?

```python
loader = EnconvertLoader(ingest_url="https://docs.example.com", mode="sitemap", max_pages=100)
docs = loader.load()
```

Il loader blocca fino al completamento del crawl, quindi restituisce un Document per chunk. Usa `mode="crawl"` per il crawling HTTP, `"sitemap"` per l'analisi della mappa del sito o `"hybrid"` per entrambi.

### Come verifico il render_quality di una pagina?

I metadati di ogni Document includono `render_quality`, un punteggio da 0,0 a 1,0. Un punteggio basso significa che la pagina era bloccata o vuota. Dirama prima di indicizzare:

```python
for doc in docs:
    if doc.metadata.get('render_quality', 1.0) > 0.5:
        vectorstore.add_documents([doc])
```

### Posso trasmettere i Document uno alla volta?

Sì, usa `.lazy_load()`:

```python
for doc in loader.lazy_load():
    print(doc.page_content[:100])
```

### Che cosa fare se ho bisogno di esplorare molti siti?

Crea un loader per sito e chiama `.load()` in sequenza, oppure usa `.aload()` in un contesto async per distribuire i crawl in parallelo.
