使用 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>
预期分辨率为元素属性:x、y、z、偏航
遍历由 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']
我在 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>
预期分辨率为元素属性:x、y、z、偏航
遍历由 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']