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

zen*_*der 3 python xml xslt xpath lxml

我有一个像

<a class="someclass">
Wie
<em>Messi</em>
einen kleinen Jungen stehen lässt
</a>
Run Code Online (Sandbox Code Playgroud)

我如何构造一个 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()

但它没有帮助。任何解决方案?

我正在考虑另一种方法,我以某种方式获取<a>元素的“内部 html” (在上述情况下为"Wie <em>Messi</em> einen kleinen Jungen stehen lässt")并<em>从 html 中删除标签。

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

Tom*_*lak 5

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()])
Run Code Online (Sandbox Code Playgroud)

印刷

梅西如何让一个小男孩站着

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

for a in doc.xpath("//a"):
    print a.xpath("normalize-space()")
Run Code Online (Sandbox Code Playgroud)

  • 循环内的`print a.xpath('normalize-space(.)')` 怎么样? (3认同)