lxml XPath - 如何从节点获取连接文本

时间:2014-06-17 11:24:51

标签: python xml xslt xpath lxml

我有一个类似

的节点
<a class="someclass">
Wie
<em>Messi</em>
einen kleinen Jungen stehen lässt
</a>

如何构建XPath以获取["Wie Messi einen kleinen Jungen stehen lässt"]而不是["Wie","Messi","einen kleinen Jungen stehen lässt"]

我在XPath中使用python lxml.html函数。

尝试过组合

  1. //a/node()/text()
  2. //a/descendant::*/text()
  3. //a/text()
  4. 但它没有帮助。任何解决方案?

    我正在考虑另一种方法,我以某种方式得到<a>元素的“内部html”(在上面的例子中将是"Wie <em>Messi</em> einen kleinen Jungen stehen lässt")并从中移除<em>标签HTML。

    还在试图弄清楚如何从XPath获取innerhtml(Javascript,任何人?)。

2 个答案:

答案 0 :(得分:4)

XPath是一种选择语言,因此它可以做的是选择节点。如果输入中有单独的节点,那么您将获得单独节点的列表作为选择结果。

你需要你的宿主语言的帮助 - 在这种情况下是Python - 来做超出这个范围的事情(比如,将文本节点合并成单个字符串)。

您需要查找所有<a>元素并加入其各自的文本后代。这很容易做到:

from lxml import etree

doc = etree.parse("path/to/file")

for a in doc.xpath("//a"):
    print " ".join([t.strip() for t in a.itertext()])

打印

Wie Messi einen kleinen Jungen stehen lässt

正如保罗在下面的评论中正确指出的那样,你可以使用XPath的normalize-space(),整个事情变得更加简单。

for a in doc.xpath("//a"):
    print a.xpath("normalize-space()")

答案 1 :(得分:1)

如果您获得<a>节点的字符串值而不是使用text(),您将获得所有子节点的字符串值的串联,而不是单个节点的串联值文本节点。

尝试使用

//a

以宿主语言将节点作为字符串读取。在Python中,您可以使用@Tomalak提到的DOM函数来获取字符串值。在 lxml 中,您可以使用.text_content()

tree.XPath("//a)").text_content()

在XPath中,您可以使用类型功能:

string(//a)