零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战

大家好,我是工藤学编程 🦉 一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉 C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列🐷 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
分库分表 分库分表之实战-sharding-JDBC分库分表执行流程原理剖析
消息队列 深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK)
AI大模型 零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战全指南

前情摘要
1、零基础学AI大模型之读懂AI大模型
2、零基础学AI大模型之从0到1调用大模型API
3、零基础学AI大模型之SpringAI
4、零基础学AI大模型之AI大模型常见概念
5、零基础学AI大模型之大模型私有化部署全指南
6、零基础学AI大模型之AI大模型可视化界面
7、零基础学AI大模型之LangChain
8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路
9、零基础学AI大模型之Prompt提示词工程
10、零基础学AI大模型之LangChain-PromptTemplate
11、零基础学AI大模型之ChatModel聊天模型与ChatPromptTemplate实战
12、零基础学AI大模型之LangChain链
13、零基础学AI大模型之Stream流式输出实战
14、零基础学AI大模型之LangChain Output Parser
15、零基础学AI大模型之解析器PydanticOutputParser
16、零基础学AI大模型之大模型的"幻觉"
17、零基础学AI大模型之RAG技术
18、零基础学AI大模型之RAG系统链路解析与Document Loaders多案例实战
19、零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析

本文章目录

  • [零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战](#零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战)
    • [1. 前言:为什么需要这两个加载器?](#1. 前言:为什么需要这两个加载器?)
    • [2. 第一部分:WebBaseLoader实战(网页文本提取)](#2. 第一部分:WebBaseLoader实战(网页文本提取))
    • [3. 第二部分:Docx2txtLoader实战(Word文本提取)](#3. 第二部分:Docx2txtLoader实战(Word文本提取))

零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战

在RAG(检索增强生成)系统的"文档加载"环节,除了PDF,Web网页 (如新闻、技术博客)和Word文档 (如企业报告、产品手册)也是高频知识库来源。之前我们已经掌握了PyPDFLoader的使用,本文将聚焦LangChain中另外两个核心加载器:

  • WebBaseLoader:抓取静态网页文本,快速构建"网页知识库";
  • Docx2txtLoader:提取Word(.docx)文档文本,适配办公场景下的知识整理。

通过本文,你将学会从"网页"和"Word"中提取文本,进一步完善RAG系统的"数据源覆盖能力"。


1. 前言:为什么需要这两个加载器?

在实际RAG场景中,知识库来源往往不止PDF:

  • 若需基于"最新行业新闻""技术博客教程"构建知识,需从Web网页提取内容;
  • 若需基于"企业内部Word报告""产品需求文档(PRD)"构建知识,需从Word文档提取内容。

WebBaseLoaderDocx2txtLoader正是为这两类场景设计,它们的核心价值在于:

  • 轻量化:无需复杂配置,安装依赖后即可快速提取文本;
  • 标准化 :输出统一的Document对象,可直接对接后续的文本分割、向量存储环节;
  • 实用性:覆盖"静态网页"和"docx文档"两大高频场景,解决80%的非PDF加载需求。

2. 第一部分:WebBaseLoader实战(网页文本提取)

2.1 什么是WebBaseLoader?

WebBaseLoader是LangChain社区版中专门用于抓取静态网页内容的加载器,其工作流程为:

  1. 通过requests库发送HTTP请求,获取网页HTML源码;
  2. BeautifulSoup解析HTML,自动清理<script><style>等非文本标签;
  3. 生成包含"网页文本"和"元数据(如URL、加载时间)"的Document对象。

关键限制 :仅支持静态网页 (内容在HTML中直接渲染),不支持JavaScript动态渲染的网页(如Vue/React构建的单页应用,需改用SeleniumURLLoader,但效率较低,实际用得少)。

2.2 前置准备:安装依赖库

WebBaseLoader依赖"网络请求"和"HTML解析"工具,需先安装:

bash 复制代码
# 安装HTML解析库(BeautifulSoup4)和网络请求库(requests)
pip install beautifulsoup4 requests -i https://pypi.tuna.tsinghua.edu.cn/simple
# 确保LangChain社区版已安装(若未安装)
pip install langchain-community -i https://pypi.tuna.tsinghua.edu.cn/simple

2.3 核心实战:2类网页加载场景

场景1:加载单个静态网页(含关键注意点)

目标:抓取"博客园首页"(静态网页)的文本,查看内容和元数据。
⚠️ 关键注意点 :必须先设置USER_AGENT(模拟浏览器请求),否则会被部分网站识别为"爬虫"而拒绝访问,且USER_AGENT的设置代码要在导入WebBaseLoader之前

python 复制代码
import os
# 1. 先设置USER_AGENT(模拟Chrome浏览器,避免被反爬拦截)
# 如何获取自己的USER_AGENT?打开Chrome -> F12 -> Network -> 任意请求 -> Request Headers -> User-Agent
os.environ['USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'

# 2. 导入WebBaseLoader(必须在设置USER_AGENT之后,否则不生效)
from langchain_community.document_loaders import WebBaseLoader

# 3. 初始化加载器(传入目标URL,支持HTTP/HTTPS)
# 选择静态网页示例:博客园首页(https://www.cnblogs.com/)
loader = WebBaseLoader("https://www.cnblogs.com/")

# 4. 加载网页内容(返回Document对象列表,单个URL对应1个对象)
docs = loader.load()

# 5. 查看结果
doc = docs[0]
print(f" 网页加载成功!URL:{doc.metadata['source']}")
print(f" 元数据:{doc.metadata}")  # 含source(URL)、title(网页标题)、language(语言)等
print(f"\n 网页文本前300字符预览:\n{doc.page_content[:300]}...")

输出示例

复制代码
网页加载成功!URL:https://www.cnblogs.com/
 元数据:{'source': 'https://www.cnblogs.com/', 'title': '博客园 - 开发者的网上家园', 'language': 'zh-CN'}

网页文本前300字符预览:
博客园 - 开发者的网上家园
首页
新闻
闪存
班级
博问
社区
直播
招聘
APP
更多
首页
推荐
热门
最新
标签
随笔
文章
百科
教程
活动
展开
热门标签
Java
Python
前端
后端
Android
iOS
数据库
...
场景2:批量加载多个网页

目标:一次性抓取"百度新闻""知乎首页""掘金首页"3个静态网页的文本,批量构建网页知识库。

python 复制代码
import os
# 1. 先设置USER_AGENT(固定步骤,避免反爬)
os.environ['USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'

from langchain_community.document_loaders import WebBaseLoader

# 2. 定义要抓取的URL列表(确保均为静态网页)
target_urls = [
    "https://news.baidu.com/",  # 百度新闻(静态)
    "https://www.zhihu.com/",    # 知乎首页(部分静态,核心文本可提取)
    "https://juejin.cn/"         # 掘金首页(部分静态,核心文本可提取)
]

# 3. 初始化加载器(传入URL列表)
loader = WebBaseLoader(target_urls)

# 4. 批量加载(返回的Document列表与URL列表一一对应)
docs = loader.load()

# 5. 遍历结果,查看每个网页的关键信息
print(f" 共加载 {len(docs)} 个网页\n")
for idx, doc in enumerate(docs):
    url = doc.metadata['source']
    text_length = len(doc.page_content)
    print(f" 第{idx+1}个网页:{url}")
    print(f"   文本长度:{text_length} 字符")
    print(f"   前150字符预览:{doc.page_content[:150]}...\n")

实用优化

若URL数量多(如10+),可加入"异常捕获",避免单个网页加载失败导致整个批量任务中断:

python 复制代码
docs = []
for url in target_urls:
    try:
        loader = WebBaseLoader(url)
        doc = loader.load()[0]  # 单个URL对应1个Document
        docs.append(doc)
        print(f" 成功加载:{url}")
    except Exception as e:
        print(f" 加载{url}失败:{str(e)}")  # 打印错误原因,方便排查

2.4 常见问题与解决方案(网页加载避坑)

问题现象 常见原因 解决方案
加载后文本为空/仅含少量内容 1. 网页是JavaScript动态渲染(如Vue/React页面); 2. 被网站反爬拦截(返回403/503状态码) 1. 动态网页改用PlaywrightURLLoader(需安装playwright并配置浏览器); 2. 完善请求头(除USER_AGENT外,可添加AcceptReferer
报错"requests.exceptions.ConnectionError" 1. 网络不通; 2. URL格式错误(如少写"https://") 1. 检查网络连接; 2. 验证URL格式(确保以"http://"或"https://"开头)
文本包含大量无关内容(如广告、导航栏) 网页HTML中包含冗余标签(如广告div) 1. 加载后手动过滤关键词(如删除含"广告""点击领取"的段落); 2. 用BeautifulSoup自定义解析规则(仅提取<article>标签内容)

3. 第二部分:Docx2txtLoader实战(Word文本提取)

3.1 什么是Docx2txtLoader?

Docx2txtLoader是LangChain中专门用于提取Microsoft Word(.docx格式) 文本的加载器,特点如下:

  • 仅提取文本内容:支持段落、列表、表格中的文字,但忽略字体、颜色、字号等格式;
  • 输出简洁:单个Word文档对应1个Document对象,元数据包含文件路径;
  • 依赖轻量:核心依赖docx2txt库,安装简单,无需复杂配置。

关键限制 :仅支持.docx格式(Word 2007及以后版本),不支持旧版.doc格式。

3.2 前置准备:安装依赖与文件要求

步骤1:安装依赖库
bash 复制代码
# 安装核心Word文本提取库(docx2txt)
pip install docx2txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 确保LangChain社区版已安装
pip install langchain-community -i https://pypi.tuna.tsinghua.edu.cn/simple
步骤2:准备Word文件
  • 格式要求:必须是.docx格式(若为.doc,需用Word打开后"另存为".docx);
  • 权限要求:文件未被加密(若加密,需先解密,否则会报错"PermissionError");
  • 路径建议:将测试文件放入data文件夹(如data/test_report.docx),避免路径混乱。

3.3 核心实战:2类Word加载场景

场景1:加载单个Word文档

目标:提取data/test_report.docx的文本,查看内容长度和元数据。

python 复制代码
from langchain_community.document_loaders import Docx2txtLoader

# 1. 初始化加载器(传入Word文件路径,支持相对路径/绝对路径)
# 相对路径:data/test_report.docx(相对于当前代码文件)
# 绝对路径:C:/data/test_report.docx(Windows)
loader = Docx2txtLoader("data/test_report.docx")

# 2. 加载文档(返回Document对象列表,单个Word对应1个对象)
documents = loader.load()
doc = documents[0]

# 3. 查看结果
print(f" Word文档加载成功!")
print(f" 元数据:{doc.metadata}")  # 含source(文件路径)
print(f" 文本总长度:{len(doc.page_content)} 字符")
print(f"\n前250字符预览:\n{doc.page_content[:250]}...")

输出示例

复制代码
 Word文档加载成功!
元数据:{'source': 'data/test_report.docx'}
 文本总长度:3280 字符

前250字符预览:
产品需求文档(PRD)- 智能客服系统V1.0
1. 文档信息
1.1 文档版本:V1.0
1.2 编写日期:2024-09-01
1.3 编写人:产品部-张三
2. 项目背景
随着用户咨询量增长,现有人工客服响应效率不足,需开发智能客服系统,实现常见问题自动回复,降低人工成本。
3. 核心功能需求
3.1 自动回复功能:支持用户输入问题后,系统匹配知识库答案并实时回复;
3.2 问题分类:将用户问题分为"订单咨询""售后问题""产品咨询"三类;
...
场景2:批量加载文件夹中的所有Word文档

目标:遍历data/word_docs/文件夹,批量加载所有.docx文件,合并为统一的文档列表。

python 复制代码
from langchain_community.document_loaders import Docx2txtLoader
import os

# 1. 定义Word文件夹路径
word_folder = "data/word_docs/"
# 2. 存储所有加载后的Document对象
all_word_docs = []

# 3. 遍历文件夹,筛选.docx文件
for filename in os.listdir(word_folder):
    # 仅处理后缀为.docx的文件(忽略大小写,如.DOCX)
    if filename.lower().endswith(".docx"):
        # 拼接完整文件路径
        file_path = os.path.join(word_folder, filename)
        try:
            # 加载当前Word文档
            loader = Docx2txtLoader(file_path)
            doc = loader.load()[0]
            all_word_docs.append(doc)
            print(f" 加载成功:{filename}(文本长度:{len(doc.page_content)}字符)")
        except Exception as e:
            print(f" 加载{filename}失败:{str(e)}")

# 4. 查看批量结果
print(f"\n 批量加载完成:共加载 {len(all_word_docs)} 个Word文档")
# 可选:合并所有Word文本为单个字符串
if all_word_docs:
    full_text = "\n\n".join([doc.page_content for doc in all_word_docs])
    print(f" 所有Word合并后总字符数:{len(full_text)}")

3.4 常见问题与解决方案(Word加载避坑)

问题现象 常见原因 解决方案
报错"docx2txt.errors.DocumentError: Could not read document" 1. 文件是.doc格式(旧版Word); 2. 文件损坏或被加密 1. 用Word打开.doc文件,"另存为"选择"Word文档(.docx)"; 2. 修复损坏文件(用Word的"打开并修复"功能)或解密文件
加载后缺少表格中的文字 docx2txtLoader对复杂表格(如合并单元格)支持不足 1. 简化表格结构(避免合并单元格); 2. 改用python-docx库手动提取表格内容(示例见下文)
Word中的图片未被提取 docx2txtLoader仅提取文本,不支持图片 python-docx库提取图片(需安装python-docx),示例代码:
补充:用python-docx提取Word中的图片

若需提取Word中的图片,可搭配python-docx库,示例代码如下:

bash 复制代码
# 先安装python-docx
pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple
python 复制代码
from docx import Document
import os

def extract_word_images(word_path, save_folder="data/word_images/"):
    """
    提取Word中的图片并保存
    :param word_path: Word文件路径
    :param save_folder: 图片保存文件夹
    """
    # 创建保存文件夹(若不存在)
    os.makedirs(save_folder, exist_ok=True)
    
    # 打开Word文档
    doc = Document(word_path)
    image_idx = 1  # 图片序号,避免重名
    
    # 遍历文档中的所有元素
    for rel in doc.element.xpath('//a:blip/@r:embed', namespaces={'a': 'http://schemas.openxmlformats.org/drawingml/2006/main', 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'}):
        # 获取图片资源
        part = doc.part.related_parts[rel]
        # 图片二进制数据
        image_data = part.blob
        # 推断图片格式(根据Content-Type)
        content_type = part.content_type
        if "png" in content_type:
            ext = ".png"
        elif "jpeg" in content_type:
            ext = ".jpg"
        else:
            ext = ".bin"  # 未知格式
        
        # 保存图片
        image_path = os.path.join(save_folder, f"image_{image_idx}{ext}")
        with open(image_path, "wb") as f:
            f.write(image_data)
        print(f"📷 保存图片:{image_path}")
        image_idx += 1

# 调用函数提取图片
extract_word_images("data/test_report.docx")

5. 总结与下一步

5.1 本文核心收获

  1. WebBaseLoader:掌握静态网页的单文件/批量加载,解决"网页知识库构建"需求,学会规避反爬和动态网页问题;
  2. Docx2txtLoader :掌握Word(.docx)的文本提取,适配办公场景,学会处理.doc格式和图片提取问题;
  3. RAG衔接 :加载后的Document对象可直接对接文本分割和向量存储,完成从"数据源"到"检索库"的闭环。
相关推荐
Baihai_IDP3 小时前
怎样为你的 RAG 应用选择合适的嵌入模型?
人工智能·llm·aigc
机器之心3 小时前
AI太空竞赛?英伟达H100刚上天,谷歌Project Suncatcher也要将TPU送上天
人工智能·openai
新智元3 小时前
全球首个「导航大脑」上线!一句话让机器人自己找路回家
人工智能·openai
fl1768313 小时前
基于yolov8+vue3实现目标检测后台管理系统
人工智能·yolo·目标检测
Juchecar3 小时前
细读一篇文档的提问模版
人工智能
视觉&物联智能4 小时前
【杂谈】-制造业变革:机器人与自动化引领新时代
人工智能·ai·机器人·自动化·aigc·agi·deepseek
serve the people4 小时前
Partial Prompt Templates in LangChain
服务器·langchain·prompt
Matrix_114 小时前
论文阅读:Multi-Spectral Image Color Reproduction
论文阅读·人工智能·计算摄影
飞哥数智坊4 小时前
内置 Claude 下线,TRAE 用户又得换搭档了
人工智能·claude·trae