如何配置unstructured与HTMLHeaderTextSplitter提取pre/code标签代码
解决方案:调整Unstructured和LangChain工具提取网页pre/code标签内容
一、针对Unstructured的partition_html方法
默认情况下partition_html可能因策略过滤代码块,通过以下参数调整即可直接提取pre/code内容:
- 指定需提取的标签列表,确保包含
pre和code - 暂时关闭自动分块,先保留完整代码块,后续统一处理
- 忽略图片块避免干扰
示例代码:
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
相关产品推荐
相关产品推荐

