用XSLT提取网页数据的技巧

网页数据提取软件MetaSeeker具有操作简易的图形化界面,容易快速掌握普通的网页数据提取技能,但是,一些特殊的数据提取需求需要使用自定义XPath或XSLT规则的方法得以满足,MetaSeeker能够无缝地将用户自定义的XPath或XSLT规则片断嵌入到MetaStudio自动生成的数据提取规则框架中。文件《采集京东商城网站的产品信息的技巧》展示了另一个自定义XPath的数据提取案例。

当使用XSLT提取网页上某个HTML元素(例如 DIV)下的所有文本内容,却需要跳过其下的某个或者某几个HTML元素中的文本,例如,跳过所有的广告,此时,需要定义一个递归调用的XSLT规则,例如,

   <xsl:template name="正文">
       <xsl:apply-templates select="node()" mode="copy-content"/>
   </xsl:template>

   
   <xsl:template match="node()" mode="copy-content">
       <xsl:value-of select="."/>
       <xsl:apply-templates select="node()" mode="copy-content"/>
   </xsl:template>
   
   <xsl:template match="*[@class='t_table']" mode="copy-content"/>

当在HTML文档中的某个位置执行<xsl:call-template name="正文"/>时,将从该位置开始遍历所有子节点,将文本数据提取出来,但是跳过class='t_table'的节点及其子节点。使用该规则时,如果被遍历的节点含有A(超链接节点),发现从某个网站上提取数据时,A节点中的文本数据被提取了两遍。将上述规则修改如下:

   <xsl:template name="正文">
       <xsl:apply-templates select="node()" mode="copy-content"/>
   </xsl:template>
   
   <xsl:template match="node()" mode="copy-content">
       <xsl:value-of select="self::text()"/>
       <xsl:apply-templates select="node()" mode="copy-content"/>

   </xsl:template>
   
   <xsl:template match="*[@class='t_table']" mode="copy-content"/>

解决了提取两遍数据的问题。