电报首发资源 教程抓取数据中的实体抽取(NER):人名、地址与链接定位
教程抓取数据中的实体抽取(NER):人名、地址与链接定位,核心目标不是简单复制网页文本,而是从杂乱页面中识别人名、地址、链接等结构化实体,并将结果保存为可检索、可分析的数据。
在真实项目中,网页经常包含导航栏、广告、评论、重复内容和动态组件。只有经过抓取、清洗、识别、校验四个环节,NER 结果才具备稳定的业务价值。
🧭 一、先明确实体抽取的任务边界
NER,即命名实体识别,通常用于定位人名、机构、地点、日期、联系方式和专有名词。在网页采集场景中,还需要额外处理超链接、邮箱、电话号码等半结构化信息。
建议先定义输出字段,而不是抓到内容后再临时分析。例如,人名可以保存为 person,地址保存为 address,链接保存为 url,并记录实体在原文中的起止位置。
同时要确认数据来源具有合法授权,并遵守网站的 robots 规则、服务条款与隐私要求。对于姓名、住址和联系方式等个人信息,应当最小化采集、脱敏保存、限制访问,不要将抽取技术用于骚扰或未经许可的个人画像。
📌 建议的采集参数
REQUEST_INTERVAL = 1.5
REQUEST_TIMEOUT = 10
MAX_RETRIES = 3
MAX_PAGES = 100
RESPECT_ROBOTS_TXT = True
STORE_RAW_HTML = True
设置请求间隔、超时时间和重试次数,可以降低对目标站点的压力。保留原始 HTML 也很重要,它能帮助开发者在模型识别错误时复盘上下文并重新处理。
🧹 二、抓取后先清洗文本与 DOM 结构
NER 不应直接作用于整份网页源码。更稳妥的做法是先解析 DOM,删除 script、style、导航和重复模块,再提取正文文本;这样可以减少噪声实体和错误匹配。
链接定位则不能只依赖正则表达式,因为网页中的链接可能是相对路径、带锚点的 URL,或者由按钮事件动态生成。对于静态 HTML,应优先读取 a 标签的 href 属性,再使用基础域名完成链接补全与规范化。
import re
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urldefrag
def extract_text_and_links(html, base_url):
soup = BeautifulSoup(html, "html.parser")
for node in soup.select("script, style, nav, footer, aside"):
node.decompose()
text = soup.get_text(" ", strip=True)
links = []
for tag in soup.select("a[href]"):
raw_url = urljoin(base_url, tag["href"])
clean_url = urldefrag(raw_url)[0]
if clean_url.startswith(("http://", "https://")):
links.append({
"text": tag.get_text(" ", strip=True),
"url": clean_url
})
return text, links
上面的流程将“可见文本”和“网页链接”分开处理。最终可以对 URL 去重、过滤图片或下载文件,并保留链接文本,以便判断链接指向的是作者主页、机构页面还是普通导航。
🔗 链接定位的三个校验点
第一,过滤无效协议,例如 javascript、mailto 或空锚点是否需要单独保存;第二,统一大小写、末尾斜杠和片段标识;第三,检查链接是否属于允许的域名范围,避免把外部跳转误当成站内资源。
电报首发资源 🧠 三、使用 NER 模型识别人名与地址
人名和地址的识别难度不同。人名容易与普通词语、品牌名混淆,而地址通常由省市区、道路、门牌号和楼栋信息组合而成,因此建议采用模型识别加规则校验的混合方案。
中文 NER 可以使用 HanLP、LTP 或基于 Transformers 的模型。模型负责理解上下文,规则负责补充门牌号、邮编和 URL 等格式稳定的实体;实际选型时,应核对模型版本、训练语料、许可证和中文领域效果。
import re
import hanlp
ner = hanlp.load(hanlp.pretrained.ner.MSRA_NER_ELECTRA_SMALL_ZH)
def recognize_entities(text):
model_entities = ner(text)
addresses = re.findall(
r"(?:[省市区县旗乡镇街道]|路|街|巷|号|室)[^,。;\n]{0,30}",
text
)
return {
"model_entities": model_entities,
"address_candidates": addresses
}
正则表达式产生的只是地址候选项,不能直接视为最终结果。程序还应合并相邻片段、去除重复前缀、检查上下文,并通过人工抽样确认模型是否把公司名称或项目名称误判为地址。
🧪 用上下文提高准确率
例如“张伟路”可能是道路名称,也可能是人名与道路的组合。可以结合字段标题、附近关键词和页面结构判断:出现“联系人”时更偏向人名,出现“地址”“办公地点”时更偏向地址。
如果项目对准确率要求较高,应建立小规模标注集,分别统计精确率、召回率和 F1 值。不要只看总体识别数量,因为错误实体越多,后续搜索、推荐和数据分析越容易产生连锁误差。
电报精准找群黑科技提示:
由于 Telegram 官方搜索对中文支持极差,很多优质的推广、技术和资源群组隐藏极深。如果你正在寻找相关的活跃社群,强烈推荐使用本站首页的 【TTSO - Telegram 智能搜索 Bot】。作为目前最好用的电报综合搜索导航,只需输入关键词,即可秒级触达数十万个精选 TG 中文群组、资源频道。一键直达,帮你节省 90% 的找群时间!
电报首发资源 🗂️ 四、设计可追溯的实体结果结构
抽取结果不应只有一个字符串,还应保留来源 URL、实体类型、置信度、原文片段和抓取时间。这样的结构便于复核来源、修正错误、追踪模型变化。
{
"source_url": "https://example.com/article",
"crawled_at": "2025-01-01T10:00:00Z",
"entities": [
{
"text": "示例人物",
"type": "PERSON",
"start": 18,
"end": 22,
"confidence": 0.96
},
{
"text": "北京市朝阳区示例路1号",
"type": "ADDRESS",
"confidence": 0.88
}
],
"links": [
{
"text": "官方网站",
"url": "https://example.com"
}
]
}
保存时可以对相同实体进行规范化,例如统一全角半角字符、清理多余空格,并用哈希值辅助去重。对于个人信息,建议只保留业务必需字段,展示层使用部分遮盖,原始数据则采用权限控制和加密存储。
✅ 上线前的质量检查
至少抽取一批样本进行人工比对,重点检查人名误识别、地址截断、相对链接错误和重复 URL。还要测试空页面、编码异常、分页重复以及动态内容缺失等边界情况。
当页面结构发生变化时,优先查看原始 HTML、清洗后的文本和模型输入,而不是盲目更换模型。通过分层日志记录,可以快速判断问题来自抓取、解析、规则还是 NER 推理。
❓ 常见问题解答(FAQ)
1. 只用正则表达式能完成 NER 吗?
正则适合定位链接、邮箱、电话和部分地址格式,但难以理解上下文。人名、机构名和地名建议使用 NER 模型,再用规则进行补充和校验。
2. 为什么模型会把公司名识别人名?
这是训练语料领域差异造成的常见问题。可以增加行业词典、结合页面字段标题,并使用本领域样本进行微调或后处理,从而降低实体类型混淆。
电报首发资源 3. 动态加载的链接无法被 BeautifulSoup 找到怎么办?
BeautifulSoup 只能解析已经获得的 HTML。对于合法授权的动态页面,应使用官方 API、服务端渲染结果或经过配置的浏览器自动化工具,并控制访问频率,避免绕过权限或验证码。
电报首发资源 4. 如何判断抽取结果是否可靠?
通过人工标注集计算精确率、召回率和 F1 值,并按人名、地址、链接分别评估。上线后还应持续监控空值率、重复率、置信度分布和页面结构变化。
总体来看,网页实体抽取的关键不在于单一模型,而在于规范采集、结构化解析、上下文识别、结果校验与合规治理形成完整闭环。只有让每条实体都能追溯到原始页面,NER 数据才真正具备长期使用价值。

