langchain_community.document_loaders.recursive_url_loader.RecursiveUrlLoader

class langchain_community.document_loaders.recursive_url_loader.RecursiveUrlLoader(url: str, max_depth: Optional[int] = 2, use_async: Optional[bool] = None, extractor: Optional[Callable[[str], str]] = None, metadata_extractor: Optional[Union[Callable[[str, str], dict], Callable[[str, str, Union[Response, ClientResponse]], dict]]] = None, exclude_dirs: Optional[Sequence[str]] = (), timeout: Optional[int] = 10, prevent_outside: bool = True, link_regex: Optional[Union[str, Pattern]] = None, headers: Optional[dict] = None, check_response_status: bool = False, continue_on_failure: bool = True, *, base_url: Optional[str] = None, autoset_encoding: bool = True, encoding: Optional[str] = None)[source]

递归加载根 URL 的所有子链接。

安全提示:此加载程序是一个爬虫,它将从指定的 URL 开始爬取

并递归地扩展以爬取子链接。

通常不应在任何内部服务器上部署具有网络访问权限的网页爬虫。

控制谁可以提交爬取请求以及爬虫拥有的网络访问权限。

在爬取过程中,爬虫可能会遇到恶意URL,可能导致服务器端请求伪造(SSRF)攻击。

为了降低风险,爬虫默认情况下只会加载与起始URL同一域的URL(通过 prevent_outside 命名参数进行控制)。

这可以降低SSRF攻击的风险,但并不能完全消除。

例如,如果爬取一个托管多个站点的宿主

https://some_host/alice_site/ https://some_host/bob_site/

Alice站点上的恶意URL可能会导致爬虫向Bob站点的端点发出恶意GET请求。两个站点都托管在同一宿主上,因此这种请求默认情况下不会被阻止。

https://python.langchain.ac.cn/v0.2/docs/security/

设置

此类没有必需的附加依赖项。您可以可选安装 beautifulsoup4 以获得更丰富的默认元数据提取功能

pip install -U beautifulsoup4
实例化
from langchain_community.document_loaders import RecursiveUrlLoader

loader = RecursiveUrlLoader(
    "https://docs.pythonlang.cn/3.9/",
    # max_depth=2,
    # use_async=False,
    # extractor=None,
    # metadata_extractor=None,
    # exclude_dirs=(),
    # timeout=10,
    # check_response_status=True,
    # continue_on_failure=True,
    # prevent_outside=True,
    # base_url=None,
    # ...
)
懒加载
docs = []
docs_lazy = loader.lazy_load()

# async variant:
# docs_lazy = await loader.alazy_load()

for doc in docs_lazy:
    docs.append(doc)
print(docs[0].page_content[:100])
print(docs[0].metadata)
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" /><
{'source': 'https://docs.pythonlang.cn/3.9/', 'content_type': 'text/html', 'title': '3.9.19 Documentation', 'language': None}
异步加载
docs = await loader.aload()
print(docs[0].page_content[:100])
print(docs[0].metadata)
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" /><
{'source': 'https://docs.pythonlang.cn/3.9/', 'content_type': 'text/html', 'title': '3.9.19 Documentation', 'language': None}
内容解析/提取

默认情况下,加载器将每个链接的原始HTML设置为文档页面内容。为了将此HTML解析为更人性化的格式,您可以使用自定义 extractor 方法

# This example uses `beautifulsoup4` and `lxml`
import re
from bs4 import BeautifulSoup

def bs4_extractor(html: str) -> str:
    soup = BeautifulSoup(html, "lxml")
    return re.sub(r"

+”, “

“,soup.text.strip())

loader = RecursiveUrlLoader(

https://docs.pythonlang.cn/3.9/”, extractor=bs4_extractor,

) print(loader.load()[0].page_content[:200])

3.9.19 Documentation

Download
Download these documents
Docs by version

Python 3.13 (in development)
Python 3.12 (stable)
Python 3.11 (security-fixes)
Python 3.10 (security-fixes)
Python 3.9 (securit
元数据提取

类似于内容提取,您可以指定一个元数据提取函数来自定义如何从HTTP响应中提取Document元数据。

import aiohttp
import requests
from typing import Union

def simple_metadata_extractor(
    raw_html: str, url: str, response: Union[requests.Response, aiohttp.ClientResponse]
) -> dict:
    content_type = getattr(response, "headers").get("Content-Type", "")
    return {"source": url, "content_type": content_type}

loader = RecursiveUrlLoader(
    "https://docs.pythonlang.cn/3.9/",
    metadata_extractor=simple_metadata_extractor,
)
loader.load()[0].metadata
{'source': 'https://docs.pythonlang.cn/3.9/', 'content_type': 'text/html'}
过滤URL

您可能并不总是想从网站上提取每个URL。有四个参数允许我们控制递归加载的URL。首先,我们可以设置 prevent_outside 参数以防止提取 base_url 之外 的URL。请注意,如以下示例所示, base_url 不必与输入的URL相同。我们还可以使用 link_regexexclude_dirs 来更具体地选择URL。在下面的示例中,我们只提取包含“index”字符串且不在网站FAQ部分的python文档网站。

loader = RecursiveUrlLoader(
    "https://docs.pythonlang.cn/3.9/",
    prevent_outside=True,
    base_url="https://docs.pythonlang.cn",
    link_regex=r'<a\s+(?:[^>]*?\s+)?href="([^"]*(?=index)[^"]*)"',
    exclude_dirs=['https://docs.pythonlang.cn/3.9/faq']
)
docs = loader.load()
['https://docs.pythonlang.cn/3.9/',
'https://docs.pythonlang.cn/3.9/py-modindex.html',
'https://docs.pythonlang.cn/3.9/genindex.html',
'https://docs.pythonlang.cn/3.9/tutorial/index.html',
'https://docs.pythonlang.cn/3.9/using/index.html',
'https://docs.pythonlang.cn/3.9/extending/index.html',
'https://docs.pythonlang.cn/3.9/installing/index.html',
'https://docs.pythonlang.cn/3.9/library/index.html',
'https://docs.pythonlang.cn/3.9/c-api/index.html',
'https://docs.pythonlang.cn/3.9/howto/index.html',
'https://docs.pythonlang.cn/3.9/distributing/index.html',
'https://docs.pythonlang.cn/3.9/reference/index.html',
'https://docs.pythonlang.cn/3.9/whatsnew/index.html']

使用要爬取的URL和任何要排除的子目录初始化。

参数
  • url (str) – 要爬取的URL。

  • max_depth (可选[int]) – 递归加载的最大深度。

  • use_async (可选[bool]) – 是否使用异步加载。如果为True,lazy_load函数将不会懒加载,但将继续按预期工作,只是不是懒加载。

  • extractor (可选[Callable[[str], str]]) – 一个函数,用于从原始HTML中提取文档内容。当提取函数返回空字符串时,文档将被忽略。默认返回原始HTML。

  • metadata_extractor (可选[_MetadataExtractorType]) –

    一个函数,用于从以下参数中提取元数据:原始HTML、源URL以及requests.Response/aiohttp.ClientResponse对象(按此顺序)。默认提取器将尝试使用BeautifulSoup4提取页面的标题、描述和语言。 ..代码块:: python

    import requests import aiohttp

    def simple_metadata_extractor(

    raw_html: str, url: str, response: Union[requests.Response, aiohttp.ClientResponse]

    ) -> dict

    content_type = getattr(response, “headers”)).get(“Content-Type”, “”) return {"source": url, "content_type": content_type}

  • exclude_dirs可选):[str 序列] – 要排除的子目录列表。

  • timeout可选):[int] – 请求的超时时间,单位为秒。如果为 None,则不会超时。

  • prevent_outsidebool) – 如果为 True,防止加载根网址之外的网络地址。

  • link_regexUnion):[strre.PatternNone] – 用于从网页的原始 html 中提取子链接的正则表达式。

  • headers可选):[dict] – 所有请求使用的默认请求头。

  • check_response_statusbool) – 如果为 True,检查 HTTP 响应状态并且跳过错误响应的 URL(400-599)。

  • continue_on_failurebool) – 如果为 True,在获取或解析链接时引发异常则继续。否则,引发异常。

  • base_url可选):[str] – 用于检查外部链接的基准 URL。

  • autoset_encodingbool) – 是否自动设置响应的编码。如果为 True,除非已显式设置 encoding 参数,否则将根据明显编码设置响应编码。

  • encoding可选):[str] – 响应的编码。如果手动设置,则无论 autoset_encoding 参数为何,编码都将设置为给定值。

方法

__init__(url[, max_depth, use_async, ...])

使用要爬取的URL和任何要排除的子目录初始化。

alazy_load()

Documents 的懒加载器。

aload()

将数据加载到 Document 对象中。

lazy_load()

懒加载网页。

load()

将数据加载到 Document 对象中。

load_and_split([text_splitter])

加载 Documents 并将其拆分为块。

__init__(url: str, max_depth: Optional[int] = 2, use_async: Optional[bool] = None, extractor: Optional[Callable[[str], str]] = None, metadata_extractor: Optional[Union[Callable[[str, str], dict], Callable[[str, str, Union[Response, ClientResponse]], dict]]] = None, exclude_dirs: Optional[Sequence[str]] = (), timeout: Optional[int] = 10, prevent_outside: bool = True, link_regex: Optional[Union[str, Pattern]] = None, headers: Optional[dict] = None, check_response_status: bool = False, continue_on_failure: bool = True, *, base_url: Optional[str] = None, autoset_encoding: bool = True, encoding: Optional[str] = None) None[source]

使用要爬取的URL和任何要排除的子目录初始化。

参数
  • url (str) – 要爬取的URL。

  • max_depth (可选[int]) – 递归加载的最大深度。

  • use_async (可选[bool]) – 是否使用异步加载。如果为True,lazy_load函数将不会懒加载,但将继续按预期工作,只是不是懒加载。

  • extractor (可选[Callable[[str], str]]) – 一个函数,用于从原始HTML中提取文档内容。当提取函数返回空字符串时,文档将被忽略。默认返回原始HTML。

  • metadata_extractor可选):[Callable [[strstr],dict]Callable [[strstrUnion [ResponseClientResponse]]dict]

    一个函数,用于从以下参数中提取元数据:原始HTML、源URL以及requests.Response/aiohttp.ClientResponse对象(按此顺序)。默认提取器将尝试使用BeautifulSoup4提取页面的标题、描述和语言。 ..代码块:: python

    import requests import aiohttp

    def simple_metadata_extractor(

    raw_html: str, url: str, response: Union[requests.Response, aiohttp.ClientResponse]

    ) -> dict

    content_type = getattr(response, “headers”)).get(“Content-Type”, “”) return {"source": url, "content_type": content_type}

  • exclude_dirs可选):[str 序列] – 要排除的子目录列表。

  • timeout可选):[int] – 请求的超时时间,单位为秒。如果为 None,则不会超时。

  • prevent_outsidebool) – 如果为 True,防止加载根网址之外的网络地址。

  • link_regex可选):[Union [strPattern] – 用于从网页的原始 html 中提取子链接的正则表达式。

  • headers可选):[dict] – 所有请求使用的默认请求头。

  • check_response_statusbool) – 如果为 True,检查 HTTP 响应状态并且跳过错误响应的 URL(400-599)。

  • continue_on_failurebool) – 如果为 True,在获取或解析链接时引发异常则继续。否则,引发异常。

  • base_url可选):[str] – 用于检查外部链接的基准 URL。

  • autoset_encodingbool) – 是否自动设置响应的编码。如果为 True,除非已显式设置 encoding 参数,否则将根据明显编码设置响应编码。

  • encoding可选):[str] – 响应的编码。如果手动设置,则无论 autoset_encoding 参数为何,编码都将设置为给定值。

返回类型

None

async alazy_load AsyncIterator[Document]

Documents 的懒加载器。

返回类型

AsyncIterator[Document]

async aload List[Document]

将数据加载到 Document 对象中。

返回类型

列表[文档]

lazy_load() Iterator[Document][source]

懒加载网页。当 use_async 为 True 时,此函数不会是懒加载的,但它仍将以预期的方 式工作,只是不是懒加载。

返回类型

迭代器[文档]

load() List[Document]

将数据加载到 Document 对象中。

返回类型

列表[文档]

load_and_split(text_splitter: Optional[TextSplitter] = None) List[Document]

加载文档并将它们拆分成块。块作为文档返回。

不要覆盖此方法。应考虑将其弃用!

参数

text_splitter (可选TextSplitter – 用于拆分文档的 TextSplitter 实例。默认为 RecursiveCharacterTextSplitter。

返回

文档列表。

返回类型

列表[]文档

使用 RecursiveUrlLoader 的示例