如何使用lxml创建文档子集?

时间:2016-10-19 15:07:39

标签: python python-2.7 lxml

假设您有一个lmxl.etree元素,其内容如:

<root>
    <element1>
        <subelement1>blabla</subelement1>
    </element1>
    <element2>
        <subelement2>blibli</sublement2>
    </element2>
</root>

我可以使用find或xpath方法来获取元素呈现的内容:

<element1>
    <subelement1>blabla</subelement1>
</element1>

简单是否有办法获得:

<root>
    <element1>
        <subelement1>blabla</subelement1>
    </element1>
</root>

即感兴趣的元素加上文档根目录下的所有它的祖先?

2 个答案:

答案 0 :(得分:2)

我不确定它内置了什么东西,但这里有一个可怕的,“不要在现实生活中使用它”类型的变通方法使用iterancestors() parent iterator

from lxml import etree as ET

data = """<root>
    <element1>
        <subelement1>blabla</subelement1>
    </element1>
    <element2>
        <subelement2>blibli</subelement2>
    </element2>
</root>"""


root = ET.fromstring(data)
element = root.find(".//subelement1")

result = ET.tostring(element)
for node in element.iterancestors():
    result = "<{name}>{text}</{name}>".format(name=node.tag, text=result)

print(ET.tostring(ET.fromstring(result), pretty_print=True))

打印:

<root>
  <element1>
    <subelement1>blabla</subelement1>
  </element1>
</root>

答案 1 :(得分:1)

以下代码删除了没有List<string> result2 = persons.SelectMany(p => new[] {p.Name, p.Job}).ToList(); 个后代且未命名为subelement1的元素。

subelement1

输出:

from lxml import etree

tree = etree.parse("input.xml")  # First XML document in question

for elem in tree.iter():
    if elem.xpath("not(.//subelement1)") and not(elem.tag == "subelement1"):
        if elem.getparent() is not None:
            elem.getparent().remove(elem)

print etree.tostring(tree)