Ajustes de LangChain WebBaseLoader que conservan el texto de la página y eliminan Chrome
WebBaseLoader carga las páginas en Documents. SoupStrainer, los encabezados, SSL, proxies, tiempos de espera, límites de velocidad y sesiones determinan si la incorporación mediante RAG obtiene el texto del artículo o ruido de navegación.
WebBaseLoader convierte una URL en un Document de LangChain. La función de obtención por defecto suele mezclar el texto principal del artículo con barras laterales, navegación y elementos de búsqueda. Los parámetros del constructor permiten controlar el análisis del texto, los encabezados, SSL, proxies, tiempos de espera, procesamiento por lotes, sesiones y metadatos, de modo que los pipelines conserven solo el contenido relevante y descarten el resto. La guía a continuación utiliza una página de documentación real como ejemplo y explica cada parámetro por turnos.
Configuración
pip install langchain langchain-community beautifulsoup4
WebBaseLoader depende de beautifulsoup4 para el análisis del HTML y de requests para las operaciones HTTP. Instale ambos en el mismo entorno que los cargadores comunitarios de LangChain.
Página web para el experimento
https://reference.langchain.com/python/langchain-community/document_loaders/web_base/WebBaseLoader
Dirija el cargador hacia una URL pública y estable de documentación para que sea fácil comparar los efectos de los parámetros en diferentes ejecuciones.
El constructor
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
)
Solo se requiere web_path. Todo lo demás ajusta el comportamiento de obtención y análisis para sitios con más ruido o redes más estrictas.
web_path
web_path acepta una sola URL o una lista de URLs. Las listas permiten cargas por lotes en una sola llamada; únelas con los límites de tasa y las políticas de error descritas más adelante para que un host problemático no detenga todo el proceso.
bs_kwargs
bs_kwargs transfiere los argumentos por palabra clave a BeautifulSoup. Una opción muy útil es parse_only con bs4.SoupStrainer, que restringe el análisis a las etiquetas seleccionadas y excluye los elementos secundarios del page_content. Las herramientas de desarrollo del navegador ayudan a identificar las etiquetas relevantes en la página objetivo; por ejemplo, un h1 que contiene el título. Después de filtrar solo esa etiqueta, el cargador devuelve una cadena simplificada en lugar del cuerpo completo y pesado del documento.
bs_get_text_kwargs
Después de que BeautifulSoup reduce el árbol, get_text() lo aplaniza. bs_get_text_kwargs pasa los argumentos a esa llamada. Al combinar un filtro de etiquetas (por ejemplo h2) con separator="|" y strip=True, se insertan límites visibles entre los fragmentos adyacentes y se elimina el espacio en blanco no deseado, de modo que los títulos y etiquetas no se mezclen en el texto del documento.
default_parser
default_parser selecciona el analizador de BeautifulSoup. El analizador integrado "html.parser" no requiere complementos adicionales, pero es menos tolerante con marcado dañado. En páginas correctamente formadas, la elección del analizador puede no mostrar diferencia visible; en HTML desordenado, probar lxml o html5lib (cuando estén instalados) puede ayudar a recuperar la estructura.
header_template
Algunos servidores rechazan a los agentes de usuario de Python sin más información con un código HTTP 403. El agente predeterminado de WebBaseLoader es genérico. header_template permite a quienes lo utilizan establecer encabezados similares a los de un navegador:
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"
}
)
Ese cambio soluciona muchos casos de 403, pero siguen existiendo otras medidas de defensa contra bots. Respete robots.txt y los términos del sitio antes de realizar cargas masivas.
verify_ssl y proxies
verify_ssl tiene como valor predeterminado True, por lo que los certificados inválidos o autofirmados generan un error inmediato; esto es común en servidores internos o de pruebas:
loader = WebBaseLoader(
web_path="https://internal-staging-docs.example.com/overview",
verify_ssl=False
)
Desactivar la verificación elimina un control de seguridad. Úsela únicamente para extracciones en redes locales o de confianza, nunca en flujos que obtengan URLs públicas arbitrarias.
proxies redirige la solicitud a través de proxies HTTP o HTTPS utilizando la estructura de diccionario que espera requests:
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 y raise_for_status
requests_kwargs transfiere las opciones directamente a la solicitud subyacente: tiempos de espera, cookies y cualquier otro elemento que el cargador no considere de primera categoría:
loader = WebBaseLoader(
web_path="https://docs.langchain.com/oss/python/langchain/overview",
requests_kwargs={"timeout": 10}
)
Sin un tiempo de espera, un socket atascado puede bloquear a .load() para siempre. Los trabajos sin supervisión siempre deben establecer uno.
raise_for_status tiene como valor por defecto False, por lo que las respuestas 404 o 500 siguen generando un Documento que contiene el HTML del error. Establezca este valor en True para fallar rápidamente ante estados incorrectos:
loader = WebBaseLoader(
web_path="https://docs.langchain.com/oss/python/langchain/overview",
raise_for_status=True
)
continue_on_failure
Al cargar muchas URLs, continue_on_failure decide si una excepción, tiempo de espera o estado elevado interrumpe el lote. Con una URL inválida, raise_for_status en valor falso y continue_on_failure=True, la ejecución puede finalizar e imprimir los documentos restantes en lugar de detenerse con el primer error. Es preferible registrar explícitamente las URLs omitidas para que las lagunas silenciosas no oculten pérdidas de datos.
autoset_encoding y encoding
Las respuestas son bytes hasta que se decodifican. Con autoset_encoding=True (valor por defecto), requests adivina el codificación a partir de los encabezados y el contenido. Establezca encoding explícitamente cuando una fuente miente sobre su conjunto de caracteres:
loader = WebBaseLoader(
web_path="https://docs.langchain.com/oss/python/langchain/overview",
encoding="utf-8"
)
Un codificación explícita prevalece incluso cuando autoset está activado.
requests_per_second y show_progress
Parámetros del lote:
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 limita la tasa de solicitudes: reduzca este valor cuando haya límites de velocidad o como muestra de respeto hacia el servidor origen. show_progress activa o desactiva la barra tqdm (está activada por defecto); desactívela en servicios donde las barras de progreso generen demasiados registros en los logs.
session y trust_env
Pase una instancia ya preparada de requests.Session cuando sea necesario compartir cookies de autenticación, adaptadores de reintentos o conexiones compartidas entre los cargadores:
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 tiene como valor por defecto False y controla si se aplican los proxies del entorno, como HTTP_PROXY. Establezca True cuando la máquina o contenedor ya utilice configuraciones de proxy a nivel del sistema operativo:
loader = WebBaseLoader(
web_path="https://docs.langchain.com/oss/python/langchain/overview",
trust_env=True
)
Metadatos
WebBaseLoader rellena los metadatos de <title>, <meta name="description"> y <html lang="..."> sin necesidad de una función metadata_func personalizada:
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'}
Inspeccione esos campos al crear corpus RAG para que el idioma y los títulos se transmitan junto con el texto. Combinado con SoupStrainer y tiempos de espera, el cargador se convierte en un paso controlado de ingestión en lugar de un despliegue caótico de HTML.
Configurando los parámetros
Un perfil de producción práctico suele combinar: SoupStrainer a través de bs_kwargs para el contenido principal, un header_template similar al del navegador, tiempos de espera explícitos en requests_kwargs, raise_for_status=True junto con continue_on_failure=True para tareas que involucran varias URLs, un valor moderado de requests_per_second, y una session compartida cuando son importantes las cookies de autenticación. Esa combinación convierte a WebBaseLoader de un raspador de demostración en una etapa controlada de ingesta adecuada para corpora RAG.