html语义化结构虽不直接生成知识图谱,但通过提供上下文约束、划分语义边界、降低噪声歧义,成为高质量三元组抽取的前提;如比更利于实体识别,可直接映射为三元组,语义路径也更稳定鲁棒。

HTML语义化结构本身不直接生成知识图谱,但它显著降低后续提取的噪声和歧义,是高质量三元组生成的前提条件。
为什么 <article></article> 比 <div class="content"> 更利于实体识别
<p>语义标签自带上下文约束,能减少 NER 模型的误判。比如 <code><article></article> 内的 <h1></h1> 大概率是标题实体,<time datetime="2025-03-12"></time> 明确提供时间属性值,而 <div> 里混着广告、评论、侧栏的文本,需额外规则过滤。
<ul>
<li>
<code><article></article>、<section></section> 等标签天然划分语义边界,避免跨区域错误关联(如把页脚的“© 2026 公司名”误判为主实体)
<aside></aside> 下的内容通常与主内容弱相关,可直接降权或跳过,节省 NLP 处理开销<figure><figcaption></figcaption></figure> 包裹的图片说明,比散落在 <p></p> 里的描述更容易被映射为 “图像-描述” 三元组
<dl></dl> 和 <table> 是最易转化为三元组的 HTML 结构
<p>定义列表(<code><dl></dl>)和表格(<table>)本质就是键值对或关系矩阵,无需复杂 NLP 即可抽取结构化三元组。
<ul>
<li>
<code><dl></dl> 中每组 <dt></dt>+<dd></dd> 可直接转为 (主体, 属性, 值),例如 <dt>出生地</dt>
<dd>杭州</dd> → (鲁迅, 出生地, 杭州)
<table> 的 <code><th> 列头 + <code><td> 行数据,配合 <code>scope 属性或表头合并逻辑,能稳定产出多对多关系,如“人物-任职机构-职务”
<thead>/<code><tbody> 或 <code>role="grid")容易被解析错行,建议优先用 <dl></dl> 表达简单属性集
语义缺失时,XPath/CSS 选择器会失效或泛化
当页面大量使用 <div> + class 布局,XPath 路径极易因前端重构断裂;而基于语义标签的路径(如 <code>//article/h1)稳定性高得多。
- 一个典型失败案例:
//div[@class="main-content"]/div[3]/p[1]在改版后可能指向广告文案,但//article/h1始终锚定主标题 - 某些 CMS 输出的 HTML 会保留语义标签但清空 class,此时靠 class 定位的爬虫完全失效,而语义路径仍可用
- 工具链如 Scrapy + BeautifulSoup 若配合
select("article > h1"),比正则匹配<h1.>(.*?)</h1.>更鲁棒,且天然规避 script 标签内伪 HTML
真正难的不是识别 <header></header>,而是判断它是否承载组织实体(比如企业官网首页的 <header></header> 含 Logo 和 slogan,但新闻页的 <header></header> 只含发布时间)。语义结构提供线索,但最终仍需结合领域规则做消歧——这点常被忽略。











