1

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

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

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

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

xPath 应返回一组块:

(xPath)[1]= 块 1

(xPath)[2]= 块 2

……

先感谢您

4

1 回答 1

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。

该技术直接遵循著名的 XPath 1.0 中集合交集的 Kayessian 公式

$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>
于 2012-07-23T13:10:48.380 回答