1

Webharvestを使用してWebサイトからデータを取得しています。提供されたxPathに基づいて必要なデータを取得する前に、htmlページをxmlドキュメントに変換します。

今、私は次のようなページに取り組んでいます: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}に置き換える必要があります。

この手法は、 XPath1.0の集合交差のよく知られたKayessian式から直接得られます。

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

$ns1これは、2つのノードセットとの交点を選択します$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 に答える