怎样使用XSLT抽取HTML页面上一段内容但是不要这一段中的某些内容?

使用xsl:copy-of可以将HTML的一个片段整个拷贝下来,但是,如果要将这个片段中的某些内容挖掉,怎样实现?网页抓取/数据抽取/信息提取软件工具包MetaSeeker的提取规则是自动计算得出的,能实现这种需求吗?

递归提取文本并滤除某些节点

主题名是car_forum_topic_keluzi_autohome,提取汽车论坛的帖子,有些跟贴引用楼上某帖,也就是对楼上某帖的回答,下例不想将引用部分提取出来。引用部分都位于一个class='quote'的DOM节点下,将该节点下的所有内容过滤掉。

   <xsl:template name="content">
       <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='quote']" mode="copy-content"/>

MetaSeeker工具包有很强的适应力

可以使用xsl:copy,xsl:copy只提取当前节点,而xsl:copy-of提取当前节点及其子节点并递归调用。用xsl:copy能够定制一个类似xsl:copy-of的递归调用的过程,并且在递归调用过程中可以任意控制筛选哪些节点。

网页抓取/数据抽取/信息提取软件工具包MetaSeeker最新版本将提取规则定义方法扩展到3种:

  1. 完全由软件自动生成;
  2. 用户可以使用XPath表达式指定特定信息属性的定位规则,在自动生成的数据抽取指令的基础上,用户可以手工调整某些节点的定位规则;
  3. 用户可以定义自己的XSLT提取片段,在自动生成的数据抽取指令的基础上,用户可以手工编写抽取指令文件的片段。

要实现上述需求,需要使用第三种方法,定义一个xsl:template,例如,如下template

<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"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[@id='projectTechnicalSummary']" mode="copy-description"/>
<xsl:template match="*[@class='horizontalLine']" mode="copy-description"/>
<xsl:template match="*[contains(./a//text(), 'Report Violation')]" mode="copy-description"/>
<xsl:template match="img" mode="copy-description"/>
<xsl:template match="a" mode="copy-description"/>

用于从一个freelancer project网站上提取项目描述信息,只提取节点,例如,HTML元素和文本,不提取节点属性(attribute),例如,@class等,需要过滤掉的节点用空template实现,后面四个就是其这种作用

将定义好的上述template片段放在网页抓取/数据抽取/信息提取软件工具包MetaSeeker中的MetaStudio工具的bucket editor工作台的输入框中保存,即可由系统自动嵌入到自动生成的信息提取指令文件中。