使用FreeFormat提高抓取网站页面抽取网页内容数据的精度

网站内容虽然最终都是用HTML/XHTML文档在浏览器上展现的,但是,由于(X)HTML文档是一种半结构化的文档,而且文档中经常存在错误文法,例如,某些标签只有起始标签却遗漏了结束标签等,要实现一种通用的灵活的高精度的信息提取算法是比较难的。网页抓取/数据抽取/信息提取软件工具包MetaSeeker利用了专有的FreeFormat技术,大大提高网站内容抽取的精度和适应力。虽然FreeFormat技术有一个复杂的算法作为后盾,但是,FreeFormat的理念是比较容易理解的。就是充分利用页面上的一些结构化特征信息,提高定位HTML DOM节点的精度和灵活性。此类特征信息包括节点的class属性(attribute,或叫特性)值、id属性值、节点名称(标签)、节点的其它属性名称等,其中,class属性有时也叫CSS selector(或者 style selector)在页面HTML中很常见。其实,FreeFormat的提出还有语义网络建设的社会性意义,在此主要讲解FreeFormat提高网页抓取和数据抽取精度的原理和使用方法。

目标页面结构经常变化,例如,在某个位置插入一块广告,在另一个位置发布一段公告信息,过一段时间该公告还会撤下来等等。但是HTML元素(一种DOM节点)的class值变化没有那么频繁,除非大改页面风格,如果使用第三方建站软件的话,例如,Drupal 等,普通用户几乎不会改变其结构。当前,FreeFormat主要利用class和id属性,以后可能会使用特定的HTML标签。id取值一般来说整个页面是唯一的,但是,写HTML时疏忽了没有保证唯一也是允许的;而多个HTML元素的class取值可以相同,一般用于表示一种特定的页面显示效果。

网页抓取/数据抽取/信息提取软件工具包MetaSeeker中的MetaStudio工具负责计算生成数据抽取规则,相比class,缺省优选id;因为可以有多个节点使用相同class值,所以,在很多情况下用class提取多实例数据,例如,在某个电子商务网站上的商品列表中,表示每个商品的HTML块使用相同的class值。当前提取多实例有两种方法:1,使用class作为FreeFormat;2,使用所谓的样例复制品规则,指定两个样例,由MetaStudio计算重现规则。因为FreeFormat更精确且容错能力高,所以FreeFormat优选。但是,本来是想提取单实例,选用的class在页面不唯一,这就不能用了,要用绝对定位方法,也就是使用从根节点(一般是html节点)开始到被定位节点的完整的XPath表达式。

但是,MetaStudio的自动计算产生信息提取规则的算法使用了一个优选定位原则:从当前节点往祖先节点找,尽量使用最近的那个有class或者id的节点作为定位的起点计算当前节点的XPath定位表达式,怎样选用class或者id有个缺省顺序,缺省的优先顺序是:首选id, 如果没有id则选class, 最后才选绝对定位。所以,你会发现,即使在数据映射的时候没有指定某个class或者id作为FreeFormat,程序还是自主选用了。

但是,页面结构各种各样,为了提高灵活性,在后来的版本中允许用户改变优先顺序。有三类用户配置:1,全局配置,保存在本地配置文件中;2,为每个整理箱分别配置各自的定位优先顺序;3,为所有线索配置定位优先顺序(为所有的,而不能针对单个线索)。全局配置和线索的配置在“配置”->“首选项”下做,虽然线索的配置也在这做,但是,线索的配置信息没有存在本地,而是作为信息结构的内容之一存储在服务器上。在Bucket Editor工作台上每个整理箱用一个Tab(标签窗口)展示,在Tab(FreeFormat字符串)上点击鼠标右键也会弹出一个菜单,其中有一项“首选项”是配置每个整理箱定位规则的。选择有:绝对定位,任何一个(class或者id谁先碰到就用谁,是从当前DOM节点往上级节点查找,而不是从根节点往下找),偏好id,偏好class,只用id,只用class。

有了这些手工选择,就可以应对更多的页面变化情形了,一个基本指导原则:使用的FreeFormat无论是映射指定的还是程序自己发现的要尽量与当前节点靠近,这样,目标页面即使结构变化了,在FreeFormat节点和当前节点之间插入新节点的几率会很小。