1

我是一个 Scrapy & Xpath 初学者,我正在寻找一个具有以下结构的网站

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

使用 Xpath 我只想获取ddcat1 的 value1 和 value2 (的)

这就是我现在所拥有的

//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)
       ]

如果每个都选择一个元素,上面的表达式就会准确地选择想要的两个//dt[. = 'cat1']元素。//dt[. = 'cat2']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 文档时(修改了最后两个dds 的值,因此我们确定选择了所需的元素):

<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 方法进行节点集交集:

两个节点集的交集:$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,所以自然都是 first 的兄弟节点dt,所以当你使用时,following-sibling你会得到它们。

Xpath 是在考虑 xml 的情况下制作的,在 xml 中,您可能会将dd元素作为 的子级dt,但不幸的是,这里并非如此。

woule 最简单的方法是只包括dt(不仅仅是dds)的所有兄弟姐妹,并遍历结果集直到出现 a dt。使用 Xpath 函数做同样的事情是可能的,但肯定更复杂。

于 2012-05-27T01:12:50.993 回答
1

尝试:

dt[text()="cat1"]/following-sibling::dd[preceding-sibling::dt[1]/text()='cat1']
于 2015-12-06T09:29:34.717 回答