Python 查找子节点包含某些文本的非根父节点

Python 查找子节点包含某些文本的非根父节点,python,xml,xpath,elementtree,Python,Xml,Xpath,Elementtree,我有一些xml <root> <parent> <child>foo987654</child> </parent> <parent> <child>bar15245</child> </parent> <parent> <child>baz87742</child>

我有一些xml

<root>
    <parent>
        <child>foo987654</child>
    </parent>
    <parent>
        <child>bar15245</child>
    </parent>
    <parent>
        <child>baz87742</child>
    </parent>
    <parent>
        <child>foo123456</child>
    </parent>
</root>
但我想拒绝包含foo但不是以foo开头的父节点(即
125456foo
),因此我不确定这是否可行。此外,我不确定etree是否支持这种级别的xpath

编辑:

另一个可接受的解决方案是选择孩子的文本在列表中的父母。 伪码 父项=>子项[text=“foo1”| |“bar1”| |“bar2”]


可能吗

从中可以看到,此库不支持XPath中的
contains()
运算符。我的建议是选择XPath
/parent
的所有子级,然后对每个结果进行迭代,以删除不以foo开头的子级内容

这将得到您想要的:

[elem for elem in root.findall('parent') if elem.find('child').text.startswith('foo')]
观看它的运行:

s = """<root>
    <parent>
        <child>foo987654</child>
    </parent>
    <parent>
        <child>bar15245</child>
    </parent>
    <parent>
        <child>baz87742</child>
    </parent>
    <parent>
        <child>foo123456</child>
    </parent>
</root>"""

import xml.etree.ElementTree as ET

root = ET.fromstring(s)
elems = [elem for elem in root.findall('parent') if elem.find('child').text.startswith('foo')]
使用xpath

import lxml.html
doc = lxml.html.document_fromstring(s)
for e in doc.xpath(".//child[starts-with(text(), 'foo')]"):
    print e.text

是否有一个纯xpath解决方案,而不必进行额外的迭代和删除节点?使用xml.etree?当然不是这样。如果您想使用纯XPath表达式来实现这一点,而不需要任何其他操作,我建议您使用该库。忍者!我假设这是区分大小写的,是吗?@bradxml确实区分大小写。
for elem in elems:
    print elem.find('child').text
>>>
foo987654
foo123456
import lxml.html
doc = lxml.html.document_fromstring(s)
for e in doc.xpath(".//child[starts-with(text(), 'foo')]"):
    print e.text