提高网页提取能力

前面几节讲述了完整的使用MetaStudio软件工具定义信息结构生成网页提取规则的流程,本节专门讲述提高网页提取能力的V4.x版本新增功能的使用方法,该新特性的原理记录于文章《网页提取工具软件增强》

语义结构定义和网页提取规则生成工具软件MetaStudio的最大优势在于:图形用户界面(GUI)免除操作员编写复杂的网页提取规则文件,避免引入编码错误。但是,完全使用GUI必然约束网页提取规则的适用力,如果网页结构十分复杂,例如,页面上的与主题有关的应该被提取的数据与无关数据穿插在一起,这样需要在HTML网页上一块区域中将不需要的内容逐一挖掉,必须编写复杂的XSLT模板(template)。MetaStudio V4.x版本对网页提取能力进行了增强,引入了两个级别的自定义网页提取规则片断的手段:

  • 用自定义XPath表达式为某信息属性提取网页数据
  • 用自定义的XSLT模板(template)为某信息属性提取一整块网页内容

注意:当前版本的MetaSeeker只为信息结构树中的叶子节点提取网页数据,所以,只能为叶子节点定制网页提取规则。



自定义XPath操作过程

放大

上图是为了从GetACoder项目网站上提取结构化项目信息定义的信息结构,为信息属性budget定制了一个XPath定位表达式,因为在这个网页上,FreeFormat标志几乎没有,无法通过FreeFormat标志映射达到精确提取网页内容的目的,如果单纯使用数据映射,网页提取规则又容易受网页结构变化的影响,所以,不得不求助于页面上的文字标志,有点像使用正则表达式进行网页提取,此例,利用了页面上的文字“Budget”,定义了XPath表达式:

following-sibling::table[position()=1]//*[@class='bordertable']//td[contains(preceding::td[1]/font/b/text(), 'Budget')]/small/text()

表示,从网页上的文字"Budget"后提取出预算数字。

操作步骤如下:

  1. 信息结构树(也叫整理箱结构树)上选择作为叶子节点的信息属性budget
  2. 样本页面上,选定预算数字,此例是$1000-3000,进行数据映射,将预算数字的HTML DOM节点映射到信息属性budget
  3. 完成整个信息结构的映射后,预览网页提取规则文件
  4. 在输出窗口中可以看到网页提取规则文件,其中budget信息属性的定位规则是:<xsl:value-of select="following-sibling::table[position()=1]//*[@class='bordertable']/tbody/tr/td[position()=2]/table/tbody/tr/td[position()=2]/table[position()=3]/tbody/tr[position()=2]/td/table/tbody/tr/td[position()=2]/table/tbody/tr[position()=2]/td[position()=2]/small/text()"/>
  5. 取出XPath表达式部分,改写成:following-sibling::table[position()=1]//*[@class='bordertable']//td[contains(preceding::td[1]/font/b/text(), 'Budget')]/small/text()
  6. 在信息结构树上双击该信息属性,弹出配置信息属性的特性窗口,选中block查检框(checkbox),窗口界面将被修改,在过滤器工作区选中XPath过滤器,并选中文本内容radio button,表示只提取网页文字,在自由表达式编辑框中输入自定义的XPath表达式
  7. 确定并生成网页提取规则进行验证

其中,第1~3步看似多余,实际上是要确定自定义的XPath表达式的定位路径从哪个DOM节点开始,上例是从following-sibling::table[position()=1]开始的,而不是从顶层的html节点开始,也就是说自定义的XPath表达式必须能够无缝嵌入MetaStudio自动生成的网页提取规则框架文件中。



自定义XSLT模板

放大

上图是为了从GetACoder项目网站上提取结构化项目信息定义的信息结构,为信息属性description定制了一个XSLT模板,因为在这个网页上,FreeFormat标志几乎没有,无法通过FreeFormat标志映射达到精确提取网页内容的目的,而且关于项目的信息没有放在一个单独的HTML DOM节点下(例如,DIV元素节点),而是和其它无关网页内容并列存放,所以,需要定制一个XSLT模板,将提取网页上黑体Description到黑体Reminder之间的文字,包括Reminder及其后面的文字都滤除掉,XSLT模板如下:

 <xsl:template name="description">
   <xsl:copy>
     <xsl:apply-templates select="node()" mode="copy-description"/>
   </xsl:copy>
 </xsl:template>
 
 <xsl:template match="node()" mode="copy-description">

   <xsl:copy>
     <xsl:apply-templates select="node()" mode="copy-description-deeper"/>
   </xsl:copy>
 </xsl:template>
 
 <xsl:template match="node()" mode="copy-description-deeper">
   <xsl:copy>

     <xsl:apply-templates select="node()" mode="copy-description-deeper"/>
   </xsl:copy>
 </xsl:template>

自定义XSLT模板进行网页提取的配置过程要比自定义XPath表达式简单一些,不用确定XPath定位路径的起始HTML DOM节点,步骤如下:

  1. 在信息结构树上双击信息属性description,弹出配置信息属性的特性窗口,选中block查检框(checkbox),窗口界面将被修改,在过滤器工作区选中XSLT过滤器,在编辑框中输入自定义的XSLT模板
  2. 确定并生成网页提取规则进行验证

注意:为信息属性定义的模板一定是一个命名模板,并且以信息属性名命名该模板