我正在使用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块
...
提前谢谢
答案 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>