22

任何人都可以建议一种 XPath 表达式格式,该格式返回一个字符串值,其中包含元素的某些合格子节点的连接值,但忽略其他:

<div>
    This text node should be returned.
    <em>And the value of this element.</em>
    And this.
    <p>But this paragraph element should be ignored.</p>
</div>

返回的值应该是一个字符串:

This text node should be returned. And the value of this element. And this.

这在单个 XPath 表达式中是否可行?

谢谢。

4

7 回答 7

29

在 XPath 2.0 中

string-join(/*/node()[not(self::p)], '')

于 2009-09-10T13:55:29.103 回答
20

在 XPath 1.0 中:

您可以使用

/div//text()[not(parent::p)]

捕获想要的文本节点。连接本身不能在 XPath 1.0 中完成,我建议在主机应用程序中完成。

于 2009-09-10T09:30:08.653 回答
6

这种外观有效:

用作上下文/div/

text() | em/text()

或者不使用上下文:

/div/text() | /div/em/text()

如果要连接前两个字符串,请使用以下命令:

concat(/div/text(), /div/em/text())
于 2009-09-10T08:13:31.703 回答
6
/div//text()

双斜线强制提取文本,而不考虑中间节点

于 2009-09-10T08:14:48.270 回答
0

如果您想要除 p 之外的所有孩子,您可以尝试以下操作...

    string-join(//*[name() != 'p']/text(), "")

返回...

This text node should be returned.
And the value of this element.
And this.
于 2013-06-18T00:57:47.963 回答
0

我知道这有点晚了,但我认为我的回答仍然是相关的。我最近遇到了类似的问题。而且因为我scrapy在不支持xpath 2.0的Python 3.6中使用,所以我无法使用string-join几个在线答案中建议的功能。

我最终找到了一个简单的解决方法(如下所示),我在任何 stackoverflow 答案中都没有看到,这就是我分享它的原因。

temp_selector_list = response.xpath('/div')
string_result = [''.join(x.xpath(".//text()").extract()) for x in temp_selector_list]

希望这可以帮助!

于 2019-12-31T08:29:49.900 回答
-2

您也可以使用 for-each 循环并将值组装到这样的变量中

<xsl:variable name="newstring">
    <xsl:for-each select="/div//text()">
      <xsl:value-of select="."/>
    </xsl:for-each>
  </xsl:variable>
于 2013-05-21T15:00:24.217 回答