使用包含标记的XPath在标记之间提取文本

时间:2014-06-02 20:27:55

标签: python xpath

我有以下XML:

...<span class="st">In Tim <em>Power</em>: Politieman...</span>...

我想在<span>标记之间提取部分。 为此,我使用XPath:

   /span[@class="st"]

然而,这将提取包括<span>在内的所有内容。 和

  /span[@class="st"]/text()

将返回两个文本元素的列表。一个包含&#34;在Tim&#34;。另一个&#34;:Politieman&#34;。 <em>..</em>不包括在内,并且像分隔符一样处理。

是否有返回的纯XPath解决方案:

In Tim <em>Power</em>: Politieman...

修改 感谢@helderdarocha和@TextGeek。使用XPath提取纯文本似乎非常简单,只包括<em>

/ span [@class =&#34; st&#34;] / node()解决方案创建一个包含各行的列表,在Python中创建一个String很简单。

2 个答案:

答案 0 :(得分:5)

要获取任何子节点,您可以使用:

/span[@class="st"]/node()

这将返回:

  1. 两个子文本节点
  2. 完整的<em>节点(元素和内容)。
  3. 如果您确实需要所有text()个节点,包括em内的节点,那么请获取所有text()个后代:

    /span[@class="st"]//text()
    

    /span[@class="st"]/descendant::text()
    

    这将返回三个文本节点,文本 <em>内,而不是<em>元素。

答案 1 :(得分:2)

听起来你想要相当于Javascript DOM innerHTML()函数,但对于XML。我不认为在纯XPath中可以做到这一点。

XPath并不真正对标记字符串进行操作,例如&#34;&lt; em&gt;&#34;和&#34;&lt; / em&gt;&#34;根本 - 它与Node对象树一起工作(可能有一个XPath实现试图直接使用标记,但我对此表示怀疑)。大多数XPath实现甚至不会有4个字符&#34;&lt; em&gt;&#34;任何地方(除了可能留下来打印错误消息或其他东西),当然DOM可能是从头开始而不是从XML或其他输入开始构建的。同样,XPath并没有真正意图回复标记的字符串,而是节点列表。

在XSLT或XQuery中,您可以轻松地执行此操作,但不能单独使用XPath,除非我遗漏了某些内容。

-s