使用 lxml 查找所有数字属性

Find all attributes which are number using lxml

我在 python 3.7 中使用 lxml 来解析 XML 文件。

我想遍历 XML 中包含数字的所有属性。此数字可以是实数或整数(例如 1、5.2234)。

有没有办法使用 xpath 遍历所有这些属性?或其他使用 lxml 的东西?

简短示例:

<scenario name="ChangeLane_2" type="ChangeLane" town="Town01">
    <ego_vehicle x="107" y="133.5" z="0.5" yaw="0" model="vehicle.lincoln.mkz2017" />
</scenario>

预期分辨率为元素属性:xyz偏航

遍历由 XPath 选择的属性的问题,如 //@someattribute,在 lxml 中是 returns _ElementUnicodeResult;不是具有名称或父级等属性的对象。

例如,如果您这样做:

print(tree.xpath("//@*[not(string(number(.))='NaN')]"))

你得到:

['107', '133.5', '0.5', '0']

这只是值。

我认为您需要做的是在选择父元素后遍历属性,然后尝试查看它是否可以转换为数字(浮点数或其他)。

示例...

from lxml import etree

xml = """<scenario name="ChangeLane_2" type="ChangeLane" town="Town01">
    <ego_vehicle x="107" y="133.5" z="0.5" yaw="0" model="vehicle.lincoln.mkz2017" />
</scenario>"""

tree = etree.fromstring(xml)

for elem in tree.xpath("//*[@*[not(string(number(.))='NaN')]]"):
    attrs = []
    for attr in elem.attrib:
        try:
            float(elem.get(attr))
            attrs.append(attr)
        except ValueError:
            pass
    print(attrs)

打印输出:

['x', 'y', 'z', 'yaw']