ai agent(智能体)开发 python高级应用8:crawl4ai 对用 LLMExtractionStrategy 和 python的 re 如何选择
我们在用crawl4ai 抓取数据后,对数据的提取,对于LLMExtractionStrategy 和re 我们如何选择
下面是关于 crawl4ai 的 LLMExtractionStrategy
与 Python正则表达式(re
) 的对比分析,
一、核心原理对比
维度 | LLMExtractionStrategy | Python正则表达式 (re) |
---|---|---|
底层机制 | 基于大语言模型(如GPT)的语义理解 | 基于预定义模式的字符串匹配 |
工作方式 | 理解上下文语义,动态推断数据关系 | 通过固定规则(正则语法)硬编码匹配逻辑 |
灵活性 | 高(可处理非结构化、动态变化的内容) | 低(依赖固定模式,结构变化需手动调整正则) |
学习成本 | 中高(需理解LLM API和提示工程) | 低(标准语法,开发者普遍熟悉) |
二、性能对比(以提取含"韩立"的图片为例)
1. 实现代码对比
# 使用 LLMExtractionStrategy(伪代码)
from crawl4ai import LLMExtractionStrategyextractor = LLMExtractionStrategy(instruction="提取所有包含'韩立'的图片链接,且图片宽度大于高度",output_schema={"images": ["url"]}
)
result = extractor.extract(html_content)
# 使用正则表达式
import repattern = r'\* \[!\[\]\(([^)]+)\)[^\[]*?\[([^\]]+)\]'
matches = re.findall(pattern, html_content)
filtered = [url for url, title in matches if '韩立' in title and 'w=(\d+)&h=(\d+)' and int(w) > int(h)
]
2. 性能指标
指标 | LLMExtractionStrategy | 正则表达式 |
---|---|---|
开发速度 | 快(无需编写复杂规则) | 慢(需调试正则语法) |
执行速度 | 较慢(依赖模型推理) | 极快(纯字符串操作) |
内存消耗 | 高(需加载LLM模型) | 低(无额外依赖) |
可扩展性 | 强(通过修改指令适应新需求) | 弱(需重写正则) |
三、准确性对比(相同测试数据)
场景 | LLMExtractionStrategy | 正则表达式 |
---|---|---|
标准格式匹配 | ✅ 准确(理解语义) | ✅ 准确(模式匹配) |
标题含变体(如"韩立_") | ✅ 自动识别(语义泛化) | ❌ 需修改正则(如添加韩立[\W_]* ) |
尺寸参数位置变化 | ✅ 自动解析(如h=600&w=800 ) | ❌ 需调整正则(如`(w |
多语言混合内容 | ✅ 支持(跨语言理解) | ❌ 无法处理非目标语言内容 |
四、适用场景推荐
场景 | 推荐工具 | 理由 |
---|---|---|
结构化数据(如固定表格) | ✅ 正则表达式 | 快速精准,资源消耗低 |
动态/半结构化内容(如论坛) | ✅ LLMExtractionStrategy | 适应布局变化,减少规则维护 |
多语言混合页面 | ✅ LLMExtractionStrategy | 跨语言语义理解优势 |
高实时性要求(如秒级响应) | ✅ 正则表达式 | 避免模型推理延迟 |
数据关联性提取(如人物关系) | ✅ LLMExtractionStrategy | 利用上下文推理能力 |
五、核心结论
-
选择正则表达式 (
re
) 当:- 数据模式固定且简单
- 对性能要求极高(低延迟、高吞吐)
- 无复杂语义关联需求
-
选择
LLMExtractionStrategy
当:- 处理动态或非结构化内容
- 需要跨语言/泛化能力
- 可接受一定延迟以换取开发效率
六、混合方案建议
对于实际项目,可 组合使用两者 实现最佳效果:
# 先用正则快速过滤,再用LLM精细提取
import re
from crawl4ai import LLMExtractionStrategy# 第一步:正则粗筛
pattern = r'<img .*?src="([^"]+)"' # 提取所有图片
image_urls = re.findall(pattern, html_content)# 第二步:LLM精准过滤
extractor = LLMExtractionStrategy(instruction="筛选宽度>高度且含'韩立'的图片",input_data={"images": image_urls}
)
final_images = extractor.extract()