跳至主要内容

网站地图

扩展自 WebBaseLoaderSitemapLoader 从给定的 URL 加载站点地图,然后抓取并加载站点地图中的所有页面,并将每个页面作为文档返回。

抓取是并发进行的。对并发请求有一些合理的限制,默认为每秒 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 错误

import nest_asyncio

nest_asyncio.apply()

初始化

现在我们可以实例化我们的模型对象并加载文档

from langchain_community.document_loaders.sitemap import SitemapLoader
API 参考:SitemapLoader
sitemap_loader = SitemapLoader(web_path="https://python-api.langchain.ac.cn/sitemap.xml")

加载

docs = sitemap_loader.load()
docs[0]
Fetching pages: 100%|##########| 28/28 [00:04<00:00,  6.83it/s]
Document(metadata={'source': 'https://python-api.langchain.ac.cn/en/stable/', 'loc': 'https://python-api.langchain.ac.cn/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://python-api.langchain.ac.cn/en/stable/', 'loc': 'https://python-api.langchain.ac.cn/en/stable/', 'lastmod': '2024-05-15T00:29:42.163001+00:00', 'changefreq': 'weekly', 'priority': '1'}

您可以更改 requests_per_second 参数以增加最大并发请求数,并使用 requests_kwargs 在发送请求时传递 kwargs。

sitemap_loader.requests_per_second = 2
# Optional: avoid `[SSL: CERTIFICATE_VERIFY_FAILED]` issue
sitemap_loader.requests_kwargs = {"verify": False}

延迟加载

您还可以延迟加载页面以最大程度地减少内存负载。

page = []
for doc in sitemap_loader.lazy_load():
page.append(doc)
if len(page) >= 10:
# do some paged operation, e.g.
# 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://python-api.langchain.ac.cn/sitemap.xml",
filter_urls=["https://python-api.langchain.ac.cn/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://python-api.langchain.ac.cn/en/latest/', 'loc': 'https://python-api.langchain.ac.cn/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:
# Find all 'nav' and 'header' elements in the BeautifulSoup object
nav_elements = content.find_all("nav")
header_elements = content.find_all("header")

# Remove each 'nav' and 'header' element from the BeautifulSoup object
for element in nav_elements + header_elements:
element.decompose()

return str(content.get_text())

将您的自定义函数添加到 SitemapLoader 对象中。

loader = SitemapLoader(
"https://python-api.langchain.ac.cn/sitemap.xml",
filter_urls=["https://python-api.langchain.ac.cn/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 参考:https://python.langchain.ac.cn/v0.2/api_reference/community/document_loaders/langchain_community.document_loaders.sitemap.SitemapLoader.html#langchain_community.document_loaders.sitemap.SitemapLoader


此页面是否有帮助?


您也可以留下详细的反馈 在 GitHub 上.