Skip to main content
将 HTML 文档分割为可管理块对于自然语言处理、搜索索引等文本处理任务至关重要。本指南将探索 LangChain 提供的三个文本分割器,帮助有效分割 HTML 内容: 每个分割器具有独特特性和适用场景。本指南将帮助您理解它们之间的差异、选择依据及有效使用方法。

分割器概述

HTMLHeaderTextSplitter

适用于需要基于标题层级保留文档结构的情况。
描述:基于标题标签(如 <h1>、<h2>、<h3> 等)分割 HTML 文本,并为每个标题块添加相关元数据。 功能特性:
  • 基于 HTML 元素层级进行分割
  • 保留文档结构中编码的上下文丰富信息
  • 支持按元数据合并元素或逐元素返回

HTMLSectionSplitter

适用于需要将 HTML 文档分割为较大区域的情况,如 <section>、<div> 或自定义区域。
描述:与 HTMLHeaderTextSplitter 类似,但专注于基于指定标签分割 HTML 为区域。 功能特性:
  • 使用 XSLT 转换检测和分割区域
  • 内部通过 RecursiveCharacterTextSplitter 处理大区域
  • 考虑字体大小确定区域范围

HTMLSemanticPreservingSplitter

适用于需要确保结构化元素(如表、列表等)不跨块分割,以保持上下文相关性的场景。
描述:分割 HTML 内容时保留重要元素的语义结构,如表格、列表和其他 HTML 组件。 功能特性:
  • 保留表格、列表等指定 HTML 元素
  • 支持自定义 HTML 标签处理器
  • 确保文档语义完整性
  • 内置标准化与停用词过滤

选择合适的分割器

  • 使用 HTMLHeaderTextSplitter 时:需要基于标题层级分割文档并保留标题元数据
  • 使用 HTMLSectionSplitter 时:需要将文档分割为较大区域,可能基于自定义标签或字体大小
  • 使用 HTMLSemanticPreservingSplitter 时:需要分割文档块同时保留语义元素(如表格和列表)的完整性

示例 HTML 文档

使用 HTMLHeaderTextSplitter

HTMLHeaderTextSplitter 是一个”结构-aware”的 text splitter,能够在 HTML 元素级别分割文本并为每个与给定片段相关的头部添加元数据。它可以选择逐个返回元素或合并具有相同元数据的元素,目标包括(a)尽可能保持语义相关的文本分组(b)保留文档结构中编码的富含上下文的信息。它可与其它文本分割器结合,作为分块管道的一部分使用。 这与 MarkdownHeaderTextSplitter(用于 Markdown 文件)类似。 要指定要分割的头部,在实例化 HTMLHeaderTextSplitter 时指定 headers_to_split_on,示例如下。
若需返回每个元素及其关联的头部,在实例化 HTMLHeaderTextSplitter 时指定 return_each_element=True:
与上述聚合按头部分组的方式不同,现在每个元素均以独立的 Document 形式返回:

从 URL 或 HTML 文件进行分割

直接从 URL 读取时,将 URL 字符串传入 split_text_from_url 方法。 同样,本地 HTML 文件可通过 split_text_from_file 方法传入。

限制 chunk 大小

HTMLHeaderTextSplitter(基于 HTML 头部进行分割)可与 RecursiveCharacterTextSplitter(基于字符长度限制分割)等其它分割器组合。 可通过调用第二个分割器的 .split_documents 方法实现:

局限性

不同 HTML 文档的结构差异可能较大。虽然 HTMLHeaderTextSplitter 会尝试为每个片段附加所有”相关”头部,但有时可能遗漏某些头部。例如,该算法假设头部始终位于关联文本所在的节点层级(即前序兄弟节点、祖先节点及其组合)。以下新闻文章(截至本文撰写时)的结构显示:顶层标题(h1 标签)位于独立子树中,其文本元素并不在预期层级(即与文本元素”上方”的节点)。因此,“h1” 元素及其关联文本未出现在片段元数据中(但适用时仍会显示”h2”及其关联文本):

使用 HTMLSectionSplitter

与 HTMLHeaderTextSplitter 类似,HTMLSectionSplitter 是一个”结构-aware”的 text splitter,能在元素级别分割文本并为每个与片段相关的头部添加元数据。它允许通过 HTML sections 进行分割。 它可以逐个元素返回块,也可以合并具有相同元数据的元素,目标是:(a) 使相关文本在语义上(或多或少)保持分组;(b) 保留文档结构中编码的上下文丰富信息。 使用 xslt_path 提供一个绝对路径来转换HTML以使其能够基于提供的标签检测章节。默认情况下使用 converting_to_header.xslt 文件在 data_connection/document_transformers 目录中。这用于将HTML转换为更易检测章节的格式/布局。例如 span 可以根据其字体大小转换为header标签以被检测为章节。

如何分割HTML字符串:

如何约束chunk大小:

HTMLSectionSplitter 可以与其他文本分割器一起作为分块管道使用。当章节大小超过chunk大小时,内部会使用 RecursiveCharacterTextSplitter。它还会根据确定的字体大小阈值判断文本是否为章节。

使用HTMLSemanticPreservingSplitter

HTMLSemanticPreservingSplitter 是专门设计用于在保持重要元素(如表格、列表和其他HTML组件)语义结构的同时将HTML内容分割为可管理块。这确保了此类元素不会被分割到不同块中,从而避免丢失表头、列表头等 contextual relevancy。 该分割器核心设计是创建具有上下文相关性的块。通用递归分割使用 HTMLHeaderTextSplitter 可能导致表格、列表等结构化元素在中间被分割,造成显著上下文丢失并产生不良块。 HTMLSemanticPreservingSplitter 对于包含表格和列表等结构化元素的HTML内容尤其重要,尤其是在需要保持这些元素完整时。此外,其支持为特定HTML标签定义自定义处理器的能力使其成为处理复杂HTML文档的灵活工具。 IMPORTANT: max_chunk_size 不是块的最终最大大小,计算最大大小发生在保留内容不属于块时以确保不被分割。当将保留数据重新添加到块中时,块大小可能超过 max_chunk_size。这至关重要以确保维护原始文档结构
注意事项:
  1. 我们为代码块内容定义了自定义处理器
  2. 预处理时为特定HTML元素定义了拒绝列表以分解其内容
  3. 故意设置较小的块大小以演示元素不分割

保留表格和列表

在这个示例中,我们将演示 HTMLSemanticPreservingSplitter 如何在HTML文档中保留一个表格和一个大型列表。将块大小设置为50字符以说明分割器如何确保即使超出定义的最大块大小,这些元素也不会被分割。

解释

在这个示例中, HTMLSemanticPreservingSplitter 确保整个表格和基于 <ul> 的无序列表被保留在其 respective 块中。即使块大小设置为50字符,分割器仍识别这些元素不应被分割并保持完整。 这在使用数据表格或列表时尤为重要,分割内容可能导致上下文丢失或混淆。最终 @[Document] 对象保留了这些元素的全部结构,确保信息 contextual relevance 得以维持。

使用自定义处理器

HTMLSemanticPreservingSplitter 允许为特定HTML元素定义自定义处理器。某些平台可能包含 BeautifulSoup 无法原生解析的自定义HTML标签,此时可使用自定义处理器添加格式逻辑。 这特别适用于需要特殊处理的内容,如 <iframe> 标签或特定 ‘data-’ 元素。例如,我们创建一个自定义处理器将 iframe 标签转换为类似Markdown的链接。

解释

在这个示例中,我们为 iframe 标签定义了自定义处理器将其转换为Markdown样式的链接。当分割器处理HTML内容时,会使用该自定义处理器转换 iframe 标签同时保留其他元素如表格和列表。最终 @[Document] 对象展示了如何根据您提供的自定义逻辑处理iframe。 Important: 当保留链接等项时,应避免在分隔符中包含 . 或留空分隔符。 RecursiveCharacterTextSplitter 以句点为分隔符会切割链接。请使用 . 定义分隔符列表。

使用自定义处理器分析带LLM的图像

通过自定义处理器,我们可以覆盖任何元素的默认处理。一个绝佳示例是直接在分块流程中插入对文档中图像的语义分析。 由于我们的函数在发现标签时被调用,我们可以覆盖 <img> 标签并关闭 preserve_images 以插入任何希望嵌入块的内容。

解释:

我们为 <img> 元素编写了自定义处理器以提取特定字段,进而通过智能体进一步处理数据并将结果直接插入块中。需确保 preserve_images 设置为 False 以避免 <img> 字段的默认处理。
官方原文:src/oss/python/integrations/splitters/split_html.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026