1

私は Scrapy と Xpath の初心者で、次の構造の Web サイトを解析しようとしています。

<dl class="ismSummary ismHomeSummary">
        <dt>cat1</dt>
            <dd>value1</dd>
            <dd>value2</dd>
        <dt>cat2</dt>
            <dd>value1</dd>
            <dd>value2</dd>
</dl>

Xpath を使用すると、 cat1の value1 と value2 (ddの )のみを取得したい

これは私が今持っているものです

//dt[text()="cat1"]/following-sibling::dd

問題は、cat2 で停止せず、cat2 から value1 と value2 を選択し続けることです。:(

4

3 に答える 3

4

使用:

//dt[. = 'cat1']
     /following-sibling::dd
       [count(.| //dt[. = 'cat2']/preceding-sibling::dd)
       =
        count(//dt[. = 'cat2']/preceding-sibling::dd)
       ]

that //dt[. = 'cat1']and //dt[. = 'cat2']each select が 1 つの要素のみを選択する場合、上記の式は必要な 2 つのdd要素を正確に選択します。

XSLT ベースの検証:

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

 <xsl:template match="/">
  <xsl:copy-of select=
  "//dt[. = 'cat1']
     /following-sibling::dd
       [count(.| //dt[. = 'cat2']/preceding-sibling::dd)
       =
        count(//dt[. = 'cat2']/preceding-sibling::dd)
       ]

  "/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると(最後の 2 つddの の値が変更されるため、目的の要素が確実に選択されていることがわかります):

<dl class="ismSummary ismHomeSummary">
    <dt>cat1</dt>
    <dd>value1</dd>
    <dd>value2</dd>
    <dt>cat2</dt>
    <dd>value3</dd>
    <dd>value4</dd>
</dl>

XPath 式が評価され、選択されたノードが出力にコピーされます。

<dd>value1</dd>
<dd>value2</dd>

説明:

ここでは、XPath 1.0のノード セットの交差に Kayessian 法を使用しています。

2 つのノードセットの交点:$ns1$ns2:

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

$ns1私たちの場合、次のように置き換えます。

//dt[. = 'cat1']/following-sibling::dd

$ns2そして、次のように置き換えます。

//dt[. = 'cat2']/preceding-sibling::dd
于 2012-05-27T01:26:27.893 に答える
3

ここのすべてのノードは の子でdlあるため、当然のことながら、すべてが最初の の兄弟であるdtため、使用following-siblingするとそれらすべてが取得されます。

Xpath は xml を念頭に置いて作成されました。xml では、おそらくdd要素を の子として持つことになりますdtが、残念ながら、ここではそうではありません。

最も簡単な方法は、dt(s だけでなくdd) のすべての兄弟を含め、結果セットを adtが現れるまで反復することです。Xpath 関数を使用して同じことを行うことは可能ですが、確かにより複雑です。

于 2012-05-27T01:12:50.993 に答える