Startseite / Artikel

LangChain WebBaseLoader-Einstellungen, die den Seitentext beibehalten und Chrome entfernen

WebBaseLoader lädt Seiten in die Dokumente herunter. SoupStrainer, Header, SSL, Proxy-Server, Zeitlimits, Bandbreitenbeschränkungen sowie Sessions bestimmen, ob die RAG-Eingabe den Artikeltext oder störende Navigationselemente erhält.

Verlag: REACTAPP.TOP5 Min. Lesezeit1064 Wörter

Quellen: Loading Web Pages in LangChain with WebBaseLoader

WebBaseLoader wandelt eine URL in ein LangChain Document um. Die Standardabfrage mischt oft den Hauptartikeltext mit Seitenleisten, Navigationselementen und Suchfunktionen. Über die Konstruktor-Einstellungen kann man das Parsen, die Header, SSL, Proxy-Server, Zeitlimits, Batching, Sessions sowie Metadaten steuern, sodass die Pipelines nur den relevanten Inhalt beibehalten und alles Weitere entfernen. Die untenstehende Anleitung verwendet eine echte Dokumentationsseite als Beispiel und behandelt nacheinander jeden Parameter.

Einrichtung

pip install langchain langchain-community beautifulsoup4

WebBaseLoader setzt sich für das HTML-Parsing auf beautifulsoup4 und für HTTP-Anfragen auf requests zusammen. Installieren Sie beide in derselben Umgebung wie LangChains Community-Loader.

Webseite für das Experiment

https://reference.langchain.com/python/langchain-community/document_loaders/web_base/WebBaseLoader

Weisen Sie den Loader auf eine stabile, öffentliche Dokumentations-URL hin, damit die Auswirkungen der Parameter bei verschiedenen Ausführungen leicht verglichen werden können.

Der Konstruktor

WebBaseLoader(
    web_path: Union[str, Sequence[str]] = '',
    header_template: Optional[dict] = None,
    verify_ssl: bool = True,
    proxies: Optional[dict] = None,
    continue_on_failure: bool = False,
    autoset_encoding: bool = True,
    encoding: Optional[str] = None,
    web_paths: Sequence[str] = (),
    requests_per_second: int = 2,
    default_parser: str = 'html.parser',
    requests_kwargs: Optional[Dict[str, Any]] = None,
    raise_for_status: bool = False,
    bs_get_text_kwargs: Optional[Dict[str, Any]] = None,
    bs_kwargs: Optional[Dict[str, Any]] = None,
    session: Any = None,
    *,
    show_progress: bool = True,
    trust_env: bool = False
)

Nur web_path ist erforderlich. Alles Weitere dient dazu, das Verhalten bei Abrufen und Auswerten für störanfälligere Websites oder strengere Netzwerke anzupassen.

web_path

web_path akzeptiert eine einzige URL oder eine Listen von URLs. Listen ermöglichen die batchweise Ladung in einem Aufruf; kombinieren Sie sie mit später beschriebenen Geschwindigkeitsbeschränkungen und Fehlerrichtlinien, damit ein fehlerhafter Host die gesamte Aufgabe nicht blockiert.

bs_kwargs

bs_kwargs leitet Schlüsselwortargumente an BeautifulSoup weiter. Eine nützliche Option ist parse_only in Kombination mit bs4.SoupStrainer, welches die Analyse auf ausgewählte Tags beschränkt und Seitenelemente aus page_content ausschließt. Die Entwicklerwerkzeuge des Browsers helfen dabei, bedeutungsvolle Tags auf der Zielseite zu identifizieren – beispielsweise ein h1-Tag, der den Titel enthält. Nach der Filterung auf diesen Tag gibt der Lader einen gekürzten String zurück anstelle des vollständigen, mit vielen Elementen beladenen Inhalts.

bs_get_text_kwargs

Nachdem BeautifulSoup den Baum reduziert hat, glättet get_text() ihn. bs_get_text_kwargs übermittelt Argumente an diesen Aufruf. Die Kombination eines Tag-Filterns (zum Beispiel h2) mit separator="|" und strip=True fügt sichtbare Trennlinien zwischen benachbarten Abschnitten ein und entfernt überschüssigen Leerlauf, sodass Überschriften und Etiketten im Dokumenttext nicht zusammenlaufen.

default_parser

default_parser wählt den BeautifulSoup-Parser aus. Der eingebaute "html.parser" benötigt keine zusätzlichen Komponenten, ist aber weniger tolerant gegenüber fehlerhafter Markup-Struktur. Auf korrekt formatierten Seiten zeigt sich durch die Wahl des Parsers oft kein sichtbarer Unterschied; bei unordentlichem HTML können lxml oder html5lib (sofern installiert) dazu beitragen, die Struktur zu retten.

header_template

Einige Hosts lehnen reine Python-User-Agents mit HTTP 403 ab. Der Standard-Agent von WebBaseLoader ist allgemein gehalten. header_template ermöglicht es den Nutzern, browserähnliche Header festzulegen:

requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: ...
loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    header_template={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                      "(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
    }
)

Diese Änderung behebt viele Fälle von 403-Fehlern, doch andere Schutzmaßnahmen gegen Bots bleiben bestehen. Beachten Sie vor dem Massenladen die robots.txt-Regeln sowie die Nutzungsbedingungen der Website.

verify_ssl und Proxys

verify_ssl hat standardmäßig den Wert True; daher werden ungültige oder selbst signierte Zertifikate abgelehnt – was häufig auf internen oder Test-Hosts der Fall ist:

loader = WebBaseLoader(
    web_path="https://internal-staging-docs.example.com/overview",
    verify_ssl=False
)

Die Deaktivierung der Überprüfung beseitigt eine Sicherheitsmaßnahme. Beschränken Sie dies auf lokale oder vertrauenswürdige Netzwerke, niemals auf Pipelines, die beliebige öffentliche URLs abrufen.

proxies leitet den Datenfluss über HTTP- oder HTTPS-Proxys, wobei die von requests erwartete Dictionary-Struktur verwendet wird:

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    proxies={
        "http": "http://user:pass@proxyhost:port",
        "https": "https://user:pass@proxyhost:port",
    }
)

requests_kwargs und raise_for_status

requests_kwargs übermittelt die Optionen direkt an die zugrunde liegende Anfrage – Zeitlimits, Cookies sowie alles andere, was vom Lader nicht als erstklassig behandelt wird:

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    requests_kwargs={"timeout": 10}
)

Fehlt ein Zeitlimit, kann ein blockierter Socket .load() für immer blockieren. Unbeobachtete Aufgaben sollten stets eines festlegen.

raise_for_status hat standardmäßig den Wert False; daher liefern 404- oder 500-Antworten weiterhin ein Dokument mit dem Fehler-HTML. Setzen Sie diesen Wert auf True, um bei fehlerhaften Statuscodes schnell Fehler zu melden:

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    raise_for_status=True
)

continue_on_failure

Beim Laden vieler URLs entscheidet continue_on_failure, ob ein Fehler, eine Zeitüberschreitung oder ein angezeigter Statusstatus die Batch-Verarbeitung abbricht. Bei einer ungültigen dritten URL, raise_for_status auf „false“ gesetzt und continue_on_failure=True, kann die Verarbeitung abgeschlossen werden und die verbleibenden Dokumente ausgegeben werden, anstatt bereits beim ersten Fehler abzubrechen. Es ist ratsam, explizit die übersprungenen URLs zu protokollieren, damit stille Lücken keine Datenverluste verbergen.

autoset_encoding und encoding

Antworten sind bis zur Dekodierung Bytes. Bei autoset_encoding=True (Standard) schätzt requests die Kodierung aus den Header-Informationen und dem Inhalt ab. Setzen Sie encoding explizit, wenn die Quelle bezüglich ihres Zeichensatzes falsche Angaben macht:

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    encoding="utf-8"
)

Eine explizit festgelegte Kodierung hat Vorrang, selbst wenn autoset weiterhin aktiviert ist.

requests_per_second und show_progress

Einstellungen für die Batch-Verarbeitung:

loader = WebBaseLoader(
    web_path=[
        "https://docs.langchain.com/oss/python/langchain/overview",
        "https://docs.langchain.com/oss/python/langchain/quickstart",
        "https://docs.langchain.com/oss/python/langchain/install",
    ],
    requests_per_second=1,
    show_progress=True
)

documents = loader.load()
print(len(documents))

requests_per_second begrenzt die Abfragenrate – senken Sie diesen Wert bei Bandbreitenbeschränkungen oder aus Rücksicht auf den Quellserver. show_progress schaltet die tqdm-Leiste ein (standardmäßig eingeschaltet); deaktivieren Sie sie in Diensten, bei denen Fortschrittsbalken die Protokolle verunreinigen.

Sitzung und trust_env

Übergeben Sie eine vorbereitete requests.Session, wenn Authentifizierungs-Cookies, Wiederholungsadapter oder gepoolte Verbindungen zwischen den Ladevorgängen geteilt werden sollen:

import requests

session = requests.Session()
session.headers.update({"Authorization": "Bearer <token>"})

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    session=session
)

trust_env hat standardmäßig den Wert False und steuert, ob Umgebungs-Proxy-Einstellungen wie HTTP_PROXY angewendet werden. Setzen Sie True, wenn der Rechner oder Container bereits auf Proxy-Einstellungen auf Betriebssystemebene setzt:

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    trust_env=True
)

Metadaten

WebBaseLoader füllt Metadaten aus <title>, <meta name="description"> und <html lang="..."> ohne eine benutzerdefinierte metadata_func ein:

print(documents[0].metadata)
{'source': 'https://reference.langchain.com/python/langchain-community/document_loaders/web_base/WebBaseLoader', 'title': 'WebBaseLoader | langchain_community | LangChain Reference', 'description': 'Python API reference for document_loaders.web_base.WebBaseLoader in langchain_community. Part of the LangChain ecosystem.', 'language': 'en'}

Überprüfen Sie diese Felder beim Erstellen von RAG-Korpora, damit Sprache und Titel zusammen mit dem Text übertragen werden. In Kombination mit SoupStrainer und Zeitlimits wird der Lader zu einem kontrollierten Eingabeschritt anstelle eines unstrukturierten HTML-Ausdrucks.

Die Einstellungen zusammenstellen

Ein praktisches Produktionsprofil kombiniert in der Regel: SoupStrainer über bs_kwargs für den Hauptinhalt, ein browserähnliches header_template, explizite Zeitlimits in requests_kwargs, raise_for_status=True zusammen mit continue_on_failure=True für Aufgaben mit mehreren URLs, einen moderaten Wert für requests_per_second sowie eine gemeinsame session, wenn Authentifizierungs-Cookies wichtig sind. Diese Kombination verwandelt WebBaseLoader von einem Demo-Scraper in einen kontrollierten Eingabeschritt, der sich für RAG-Korpora eignet.