只获取xpath的最后一部分

时间:2015-09-08 13:44:18

标签: python xml xpath lxml

我在python 2.7中使用lxml来解析xml文件。

文件如下所示:

...
<LM>sua</LM>
<LM>citt&agrave;</LM>
<LM>e</LM>
<LM>l'</LM>
<LM>alto</LM>
<LM>seggio</LM>:
     </l><l>
<LM>oh</LM>
<LM>felice</LM>
<LM>colui</LM>
<LM>cu'</LM>
<LM>ivi</LM>
<LM>elegge</LM>!.
     </l><l>
<LM> E</LM>
<LM>io</LM>
<LM>a</LM>
<LM>lui</LM>:
...

我正在遍历树,寻找LM节点。

for node in [z for z in  tree.iterfind(".//LM")]:
    print tree.getpath(node.getparent())

我得到每个节点的以下输出:

'/TEI.2/text/body/div1/l[480]'

所以,在这种情况下,这意味着当前节点LM在第480个节点L之下。有没有办法得到这个480,请注意以下内容?

In [77]: int(tree.getpath(node.getparent()).split('/')[5][2:].replace(']',''))
Out[77]: 480

我指的是通过xpath的优雅方式。

1 个答案:

答案 0 :(得分:1)

  

所以,在这种情况下,这意味着当前节点LM在第480个节点L之下。有没有办法得到这个480,请注意以下内容?

int(tree.getpath(node.getparent()).split('/')[5][2:].replace(']',''))

如果我理解正确,你只想要相对于其父母的位置?您可以通过执行以下操作让XPath返回最后一个位置:

node.find("position()")

在正常的XPath 1.0中,这意味着“获取当前节点相对于其父节点的位置”。但是,它看起来像XPath support of this Python module is severely limited。支持的表达式只能用于返回节点而不是值。

If you can use XSLT in Python,您可以使用XPath 1.0语法//LM/position()获取所有职位。为了获得这条路,你还需要做更多的事情:

<xsl:template match="/">
    <xsl:apply-templates select="//LM" />
</xsl:template>

<xsl:template match="LM">
    <xsl:text>Position: </xsl:text>
    <xsl:value-of select="position()" />
    <xsl:text>, XPath: </xsl:text>
    <xsl:apply-templates select="ancestor::*" mode="path" />
    <xsl:text>&#xA;</xsl:text>
</xsl:template>

<xsl:template match="*" mode="path">
    <xsl:text>/</xsl:text>
    <xsl:value-of select="name()" />
</xsl:template>

这将输出一堆行,如:

Position: 4, XPath: /a/b/c
Position: 9, XPath: /a/b/d