lxml etree在之前找到最接近的元素 - python

xml文件的结构如下

<a>
    <b>
        <d>
    </b>

    <c attr1="important"/>
    <b>
        <d>
    </b>
    <c attr1="so important" />
    <b></b>
</a>

我的解析器首先获取所有<d>元素

from lxml import etree
xmltree = etree.parse(document)
elems = xmltree.xpath('//d')

现在的任务是:

如果有当前<c>标记,请从最近的<d>标记获取属性。

天真的方法是做类似以下的事情

for el in elems:
    it = el.getparent()
    while it != None and it.tag != 'c':
        prev = it.getprevious()
        if prev == None:
            it = it.getparent()
        else:
            it = prev

    if it != None:
        print el, it.get("attr1")

但是对我来说,这看起来并不简单-我在文档中缺少什么吗?如何在不实现自己的迭代器的情况下解决此问题?

参考方案

使用preceding axis:

前一个轴指示文档中上下文节点之前的所有节点,但所有祖先,属性和名称空间节点除外。

for el in elems:
    try:
        print el.xpath("preceding::c[@attr1]")[-1].get("attr1")
    except IndexError:
        print "No preceding 'c' element."

演示:

>>> from lxml import etree
>>> 
>>> data = """
... <a>
...     <b>
...         <d/>
...     </b>
... 
...     <c attr1="important"/>
...     <b>
...         <d/>
...     </b>
...     <c attr1="so important" />
...     <b></b>
... </a>
... """
>>> xmltree = etree.fromstring(data)
>>> elems = xmltree.xpath('//d')
>>> 
>>> for el in elems:
...     try:
...         print el.xpath("preceding::c[@attr1]")[-1].get("attr1")
...     except IndexError:
...         print "No preceding 'c' element."
... 
No preceding 'c' element.
important

Python 3运算符>>打印到文件 - python

我有以下Python代码编写项目的依赖文件。它可以在Python 2.x上正常工作,但是在使用Python 3进行测试时会报告错误。depend = None if not nmake: depend = open(".depend", "a") dependmak = open(".depend.mak&#…

Python ElementTree:在循环中替换元素 - python

我正在尝试创建一个脚本,该脚本循环创建一个xml文件,并为两个元素增加值。 (使用netaddr的IP地址,以及递增的tag / member元素,tag01-tag10)from netaddr import IPNetwork import xml.dom.minidom import lxml.etree as etree import xml.etr…

Python Pandas导出数据 - python

我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…

如何使用BeautifulSoup在<tr>中捕获特定的<td> - python

尝试从nyc Wiki页面中的高中列表中获取所有高中名称。我已经写了足够多的脚本,可以让我获取包含在高中,学业和入学条件列表的表的<tr>标记中的所有信息-但是我如何才能缩小到我认为的范围内在td[0]内休息(会弹出KeyError)-只是学校的名称?到目前为止我写的代码:from bs4 import BeautifulSoup from ur…

将python scikit学习模型导出到pmml - python

我想将python scikit-learn模型导出到PMML。哪个python软件包最合适?我阅读了有关Augustus的内容,但是我无法使用scikit-learn模型找到任何示例。 python大神给出的解决方案 SkLearn2PMML是 JPMML-SkLearn命令行应用程序周围的薄包装。有关受支持的Scikit-Learn Estimator和…