You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置unstructured与HTMLHeaderTextSplitter提取pre/code标签代码

解决方案:调整Unstructured和LangChain工具提取网页pre/code标签内容

一、针对Unstructured的partition_html方法

默认情况下partition_html可能因策略过滤代码块,通过以下参数调整即可直接提取pre/code内容:

  1. 指定需提取的标签列表,确保包含pre和code
  2. 暂时关闭自动分块,先保留完整代码块,后续统一处理
  3. 忽略图片块避免干扰

示例代码:

from unstructured.partition.html import partition_html

# 提取包含代码块的网页元素
elements = partition_html(
    url="你的网页URL",
    tags_to_extract=["pre", "code", "p", "h1", "h2"],  # 按需添加需要的标签
    chunking_strategy="none",  # 不自动分割,保留完整代码块
    extract_image_block_types=[]  # 忽略图片相关块
)

# 可选:给代码块添加markdown格式,方便后续向量库存储
for elem in elements:
    if elem.metadata.tag in ["pre", "code"]:
        elem.text = f"```python\n{elem.text.strip()}\n```"

# 之后可将elements转换为LangChain的Document对象,再分块存入向量库

二、针对LangChain的HTMLHeaderTextSplitter类

HTMLHeaderTextSplitter默认仅关注标题和对应文本,可通过两种方式适配代码块提取:

方式1:结合UnstructuredHTMLLoader(推荐)

利用Unstructured的能力先提取完整内容(含代码块),再用文本分割器分块:

from langchain.document_loaders import UnstructuredHTMLLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 配置Loader提取代码块
loader = UnstructuredHTMLLoader(
    "本地网页路径或网页URL",
    tags_to_extract=["pre", "code", "p", "h1", "h2"],
    chunking_strategy="none"
)
raw_docs = loader.load()

# 统一分块,优先按代码块边界分割,保证代码完整性
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    separators=["\n\n```", "```\n\n", "\n\n", "\n", " "]
)
split_docs = text_splitter.split_documents(raw_docs)

方式2:自定义扩展HTMLHeaderTextSplitter

如果必须沿用原有HTMLHeaderTextSplitter流程,可继承并重写方法,加入代码块提取逻辑:

from langchain.text_splitter import HTMLHeaderTextSplitter
from langchain.schema import Document
from bs4 import BeautifulSoup

class CodeAwareHTMLSplitter(HTMLHeaderTextSplitter):
    def split_text(self, text: str) -> list[Document]:
        # 先执行父类的标题分割逻辑
        header_docs = super().split_text(text)
        # 单独提取网页中的代码块
        soup = BeautifulSoup(text, "html.parser")
        code_blocks = soup.find_all(["pre", "code"])
        
        # 将代码块转为Document对象,加入到结果中
        for idx, block in enumerate(code_blocks):
            code_content = f"```python\n{block.get_text(strip=False)}\n```"
            header_docs.append(
                Document(
                    page_content=code_content,
                    metadata={"source": "code_block", "block_index": idx}
                )
            )
        return header_docs

# 使用自定义分割器
headers_to_split_on = [("h1", "一级标题"), ("h2", "二级标题")]
splitter = CodeAwareHTMLSplitter(headers_to_split_on=headers_to_split_on)
final_docs = splitter.split_text(你的网页HTML内容)

这两种方案都无需完全重构现有分块流程,仅通过参数调整或少量代码扩展即可实现代码块提取,避免引入额外复杂逻辑。

内容的提问来源于stack exchange,提问作者Abraham Martín Expósito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:10:17