2026-10-12 · 原文发布日
从网站Impressum页提取并校验公司信息
一个webhook式免费n8n模板:POST传入网址后,工作流抓取首页找到Impressum/imprint页面,把HTML清洗成纯文本交给OpenAI按严格JSON格式提取公司字段,再逐条核对提取值是否真的出现在原文里,丢弃无法验证的字段,最终在响应里返回已验证的公司数据、被丢弃字段和impressum网址。适合德语区客户信息核验、线索补全等场景,公开暴露端点时建议加鉴权。
原文要点
原模板是webhook式免费n8n流程:POST传website,可选organization与reference_id;先校验并规范化URL,阻止private/local地址,非法返回400。抓首页后从链接或嵌入内容找Impressum/imprint,找不到回退/impressum;抓该页转纯文本,无可用内容即停。把清洗文本送OpenAI Chat Completions按严格JSON抽公司字段,再逐字核对抽取值是否真出现在Impressum文本,未验证字段丢弃,响应返回verified数据、dropped_fields与impressum_url;公开端点建议加header鉴权。
这次做成什么
做成一个可复核的德语区公司信息抽取练习:输入一个公开测试站,输出只保留能在页面原文逐字命中的字段,并显式列出被丢字段;不编造模板节点名,不提供导入JSON。
准备什么
- n8n Cloud或自托管,能开启生产POST webhook
- OpenAI凭据或兼容提供方,可访问chat completions
- 一个允许抓取的公开测试网站,无登录与验证码
- 如公网暴露,准备header鉴权与速率限制
具体怎么做
入参校验与拒私网
webhook接收JSON后先解析website,补scheme、去空格;拒绝localhost、127.0.0.0/8、10.0.0.0/8、192.168.0.0/16、172.16.0.0/12与文件协议,非法直接400,避免把内网地址当目标。
定位Impressum
抓首页HTML,优先找文本或href含Impressum、imprint的链接;没有则试规范域名的/impressum。抓回后HTML转纯文本,保留换行,若正文低于可用长度则停止并返回no_content。
严格JSON抽取
把清洗文本连同下方提示词发给模型,要求只输出JSON对象,不得补全工商知识;字段缺省用null,不改写大小写、标点或法律形式后缀。
逐字核验再出参
对非null字符串做大小写不敏感的原文包含检查,地址等多词值需规范化空白后仍逐字命中;未命中进dropped_fields。响应只回verified_company、dropped_fields、impressum_url、reference_id。
可直接复制的材料
Impressum严格抽取提示词
本站编写示例;模型端点与字段名按原HTTP请求节点核对。
从给定德语Impressum纯文本抽取公司信息。只输出一个JSON对象,禁止markdown、禁止解释、禁止推测。键固定为:company_name, legal_form, street, postal_code, city, country, managing_directors, register_court, register_number, vat_id, email, phone。未在文本出现的值用null。必须保留原文拼写、变音符、标点与换行中的词序;managing_directors用数组,其余用字符串或null。不得从组织名参数或常识补全。文本如下:
{{$json.clean_text}}webhook测试POST体
合成域名;organization只作对照,不得用于补抽取空值。
{
"website": "https://practice-example.de",
"organization": "Practice Beispiel GmbH",
"reference_id": "demo-2026-001"
}核验规则配置
本站练习阈值;不要把min_clean_text_chars当原文保证。
{
"min_clean_text_chars": 200,
"normalize_whitespace": true,
"case_sensitive": false,
"require_literal_match": true,
"drop_if_value_null": false,
"response_keys": ["verified_company", "dropped_fields", "impressum_url", "reference_id"]
}输入与输出示例
本站虚构演示;模型把混淆邮箱还原成info@practice-example.de但未在原文逐字命中,故列入dropped_fields;未出现的vat_id与phone保留为null键。
输入
POST{"website":"https://practice-example.de","organization":"Practice Beispiel GmbH","reference_id":"demo-2026-001"},页面文本含“Practice Beispiel GmbH, Musterstraße 12, 10115 Berlin, Geschäftsführer: Ada Beispiel”,页脚另有混淆写法“info [at] practice-example [dot] de”,无电话与VAT号。对应输出
{"verified_company":{"company_name":"Practice Beispiel GmbH","street":"Musterstraße 12","postal_code":"10115","city":"Berlin","managing_directors":["Ada Beispiel"],"vat_id":null,"phone":null},"dropped_fields":["email"],"impressum_url":"https://practice-example.de/impressum","reference_id":"demo-2026-001"}做完检查这些
- 私网或畸形URL返回400且不发起外网抓取
- 找不到 imprint 时会回退尝试/impressum路径
- 模型输出非JSON或含解释文本时流程判定失败
- 任何未逐字命中的值都出现在dropped_fields而非结果里
容易卡住的地方
- JS渲染页面抓不到正文会被误判no_content
- HTML清洗丢换行可能拆散地址导致核验失败
- organization参数会诱导补全,必须只作参考
- 公网webhook无鉴权会被滥用去抓取或消耗模型额度
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Extract verified company data from website Impressum pages with OpenAI
- 原作者
- Wolfgang Renner
- 原始发布日期
- 2026-10-12T08:12:09.196Z
- 来源
- https://n8n.io/workflows/20795