如何使用python XPath返回带有过滤子元素的父元素

时间:2017-02-28 11:36:18

标签: python xml xpath filter lxml

我正在处理“父母”的数据集。元素标记在运行时是未知的,但我需要返回它和具有某个属性的任何子元素,我希望用XPath做到这一点,但我不再确定我可以;谁能帮我一把?

这是一个示例数据集:

<Images>
    <Unknown1>
        <Image url="http://a.jpg" type="art" id="1"/>
    </Unknown1>
    <Unknown2>
        <Image url="http://b.jpg" type="art" id="1"/>
        <Image url="http://c.jpg" type="art" id="2"/>
        <Image url="http://d.jpg" type="draft" id="3"/>
        <Image url="http://e.jpg" type="draft" id="4"/>
        <Image url="http://f.jpg" type="poster" id="5"/>
        <Image url="http://g.jpg" type="poster" id="6"/>
    </Unknown2>
</Images>

现在我需要按&#39;类型&#39;过滤所以我想要回归的是(如果我使用&#39;艺术&#39;过滤):

    <Unknown1>
        <Image url="http://a.jpg" type="art" id="1"/>
    </Unknown1>
    <Unknown2>
        <Image url="http://b.jpg" type="art" id="1"/>
        <Image url="http://c.jpg" type="art" id="2"/>
    </Unknown2>

令人讨厌的是,我不需要列出所有“图像”的列表。元素,而是一个列表(包含&#39;未知&#39;元素(运行时未知的实际标签)和它们包含的过滤子元素(结构如上)。

有没有可以帮助我的大师?纯XPath解决方案会更好,但我不确定它是否可行?

提前致谢。

1 个答案:

答案 0 :(得分:2)

这是一个可以满足您需求的XPATH。可能有替代方案,我还没有检查它是否适用于lxml:

//*[@type='art']/parent::*

或者您可以将其限制为:

//Image[@type='art']/parent::*

我发现http://www.zvon.org在xpath方面非常有用。它甚至有一点试验场:http://www.zvon.org/comp/tests/r/test-xlab.html#intro

@Andersson是对的,如果您查询父母,您将获得包括其所有子女在内的父母。 所以,你必须迭代孩子并让他们的父母使用lxml。