Skip to main content
SitemapLoader 继承自 WebBaseLoader,从给定 URL 加载网站地图,然后抓取并加载网站地图中的所有页面,将每个页面作为 Document 返回。 抓取是并发进行的。并发请求有合理限制,默认每秒 2 个。如果您不介意给服务器增加负担,或者您控制着被抓取的服务器,或者不在意服务器负载,可以提高此限制。注意,虽然这会加快抓取速度,但可能导致服务器封锁您。请谨慎操作!

概述

集成详情

本地支持可序列化JS 支持
SiteMapLoaderlangchain-community

加载器功能

来源文档懒加载原生异步支持
SiteMapLoader

安装

要访问 SiteMap 文档加载器,您需要安装 langchain-community 集成包。

凭证

无需任何凭证即可运行。 要启用模型调用的自动追踪,请设置您的 LangSmith API 密钥:
os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
os.environ["LANGSMITH_TRACING"] = "true"

安装依赖

安装 langchain-community
pip install -qU langchain-community

修复笔记本中的 asyncio bug

import nest_asyncio

nest_asyncio.apply()

初始化

现在可以实例化模型对象并加载文档:
from langchain_community.document_loaders.sitemap import SitemapLoader
sitemap_loader = SitemapLoader(web_path="https://api.python.langchain.com/sitemap.xml")

加载

docs = sitemap_loader.load()
docs[0]
Fetching pages: 100%|##########| 28/28 [00:04<00:00,  6.83it/s]
Document(metadata={'source': 'https://api.python.langchain.com/en/stable/', 'loc': 'https://api.python.langchain.com/en/stable/', 'lastmod': '2024-05-15T00:29:42.163001+00:00', 'changefreq': 'weekly', 'priority': '1'}, page_content='\n\n\n\n\n\n\n\n\n\nLangChain Python API Reference Documentation.\n\n\nYou will be automatically redirected to the new location of this page.\n\n')
print(docs[0].metadata)
{'source': 'https://api.python.langchain.com/en/stable/', 'loc': 'https://api.python.langchain.com/en/stable/', 'lastmod': '2024-05-15T00:29:42.163001+00:00', 'changefreq': 'weekly', 'priority': '1'}
您可以修改 requests_per_second 参数来增加最大并发请求数,并使用 requests_kwargs 传入发送请求时的关键字参数。
sitemap_loader.requests_per_second = 2
# 可选:避免 `[SSL: CERTIFICATE_VERIFY_FAILED]` 问题
sitemap_loader.requests_kwargs = {"verify": False}

懒加载

您也可以懒加载页面,以降低内存占用。
page = []
for doc in sitemap_loader.lazy_load():
    page.append(doc)
    if len(page) >= 10:
        # 执行一些分页操作,例如
        # index.upsert(page)

        page = []
Fetching pages: 100%|##########| 28/28 [00:01<00:00, 19.06it/s]

过滤网站地图 URL

网站地图文件可能非常庞大,包含数千个 URL。通常您并不需要全部内容。您可以通过向 filter_urls 参数传入字符串列表或正则表达式模式来过滤 URL,只有匹配其中一个模式的 URL 才会被加载。
loader = SitemapLoader(
    web_path="https://api.python.langchain.com/sitemap.xml",
    filter_urls=["https://api.python.langchain.com/en/latest"],
)
documents = loader.load()
documents[0]
Document(page_content='\n\n\n\n\n\n\n\n\n\nLangChain Python API Reference Documentation.\n\n\nYou will be automatically redirected to the new location of this page.\n\n', metadata={'source': 'https://api.python.langchain.com/en/latest/', 'loc': 'https://api.python.langchain.com/en/latest/', 'lastmod': '2024-02-12T05:26:10.971077+00:00', 'changefreq': 'daily', 'priority': '0.9'})

添加自定义抓取规则

SitemapLoader 使用 beautifulsoup4 进行抓取,默认会抓取页面上的所有元素。SitemapLoader 构造函数接受自定义抓取函数,可帮助您根据具体需求定制抓取流程;例如,您可能希望避免抓取页眉或导航元素。 以下示例演示如何开发并使用自定义函数来排除导航和页眉元素。 导入 beautifulsoup4 库并定义自定义函数。
pip install beautifulsoup4
from bs4 import BeautifulSoup


def remove_nav_and_header_elements(content: BeautifulSoup) -> str:
    # 在 BeautifulSoup 对象中查找所有 'nav' 和 'header' 元素
    nav_elements = content.find_all("nav")
    header_elements = content.find_all("header")

    # 从 BeautifulSoup 对象中删除每个 'nav' 和 'header' 元素
    for element in nav_elements + header_elements:
        element.decompose()

    return str(content.get_text())
将自定义函数添加到 SitemapLoader 对象。
loader = SitemapLoader(
    "https://api.python.langchain.com/sitemap.xml",
    filter_urls=["https://api.python.langchain.com/en/latest/"],
    parsing_function=remove_nav_and_header_elements,
)

本地网站地图

网站地图加载器也可用于加载本地文件。
sitemap_loader = SitemapLoader(web_path="example_data/sitemap.xml", is_local=True)

docs = sitemap_loader.load()

API 参考

有关 SiteMapLoader 所有功能和配置的详细文档,请参阅 API 参考:python.langchain.com/api_reference/community/document_loaders/langchain_community.document_loaders.sitemap.SitemapLoader.html#langchain_community.document_loaders.sitemap.SitemapLoader