从html / xml中提取数据

时间:2012-07-23 11:25:00

标签: html xml xpath webharvest

我正在使用Webharvest从网站检索数据。它会将html页面转换为xml文档,然后根据提供的xPath获取所需数据。

现在我正在处理这样一个页面:pastebin我在哪里展示了我想要的块。每个块应作为一个单元返回。

xPath块的第一个元素是://div[@id="layer22"]/b/span[@style="background-color: #FFFF99"] 我测试了它,它给出了所有“bloc start”元素。

块的最后一个元素的xPath是://div[@id="layer22"]/a[contains(.,"Join")] 我测试了它,它给出了所有“集团结束”元素。

xPath应该返回一组块:

(xPath)[1] =第1块

(xPath)[2] =第2块

...

提前谢谢

1 个答案:

答案 0 :(得分:2)

使用(对于第一个想要的结果):

  ($first)[1] | ($last)[1]

|

  ($first)[1]/following::node()
       [count(.|($last)[1]/preceding::node()) = count(($last)[1]/preceding::node())]

您需要将$first替换为:

//div[@id="layer22"]/b/span[@style="background-color: #FFFF99"]

并将$last替换为:

//div[@id="layer22"]/a[contains(.,"Join")] 

要获得第k个结果,请将最终表达式($first)[1]替换为($first)[{k}],将($last)[1]替换为($last)[{k}],其中{k}应替换为 k。

此技术直接来自着名的 Kayessian公式,用于XPath 1.0中的集合交集

$ns1[count(.|$ns2) = count($ns2)]

选择两个节点集$ns1$ns2的交集。

以下是XSLT验证的一个简单示例:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>03</num>
  <num>07</num>
  <num>10</num>
</nums>

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="v1" select=
  "(//num[. = 3])[1]/following-sibling::*"/>
 <xsl:variable name="v2" select=
  "(//num[. = 7])[1]/preceding-sibling::*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "$v1[count(.|$v2) = count($v2)]"/>
 </xsl:template>
</xsl:stylesheet>

应用XPath表达式,并将选定的节点复制到输出中:

<num>04</num>
<num>05</num>
<num>06</num>