python - Lxml 和 python:仅迭代现有元素
问题描述
我有一个包含 2 个地标的 KML 文件:Test1 和 Test2。
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
<Placemark>
<name>Test1</name>
<styleUrl>style1</styleUrl>
<Point><coordinates>1,2</coordinates></Point>
<ExtendedData xmlns:mwm="https://example">
<mwm:visibility>1</mwm:visibility>
</ExtendedData>
</Placemark>
<Placemark>
<name>Test2</name>
<styleUrl>style2</styleUrl>
<Point><coordinates>3,4</coordinates></Point>
<ExtendedData xmlns:mwm="https://example">
<mwm:scale>19</mwm:scale>
<mwm:visibility>1</mwm:visibility>
</ExtendedData>
</Placemark>
</Document>
</kml>
Test2 有一个元素 < mwm:scale > 而 Test1 没有。
我的目标是遍历所有地标,并在一个列表中记录所有地标的名称,并在另一个列表中记录所有地标的比例。
我一直在研究 lxml 和 Xpath 选项,但是当地标(父元素)中不存在元素(在本例中为“缩放”)时,我找不到“空”输出的方法。
这段代码:
import lxml.etree as et
tree = et.parse(file.kml)
for names in tree.xpath("/kml:kml/kml:Document/kml:Placemark/kml:name", namespaces={'kml': 'http://earth.google.com/kml/2.2','mwm': 'https://example'}):
name_list.append(names.text)
for scales in tree.xpath("/kml:kml/kml:Document/kml:Placemark/kml:ExtendedData/mwm:scale", namespaces={'kml': 'http://earth.google.com/kml/2.2','mwm': 'https://example'}):
scale_list.append(scales.text)
会给我那些清单
[Test1, Test2]
[19]
虽然我正在寻找一种解决方案来获得类似的东西(如果不存在规模,输出'0'):
[Test1, Test2]
[0, 19]
Any solution or idea ? I've been trying to iterate through the parsed XML but the 2 different namespaces (kml and mwm) make it impossible with the solutions I've find on the forum....
Thanks a lot for any help !
解决方案
Try something along these lines:
name_list = []
scale_list = []
ns = {'kml': 'http://earth.google.com/kml/2.2','mwm': 'https://example'}
for name in tree.xpath("/kml:kml/kml:Document/kml:Placemark/kml:name", namespaces=ns):
name_list.append(name.text)
scale = name.xpath("following-sibling::kml:ExtendedData//mwm:scale", namespaces=ns)
if len(scale)==0:
scale_list.append("0")
else:
scale_list.append(scale[0].text)
Output:
(['Test1', 'Test2'], ['0', '19'])
推荐阅读
- c - C 编程:函数返回 -1,但在 `echo $?` 后得到 255
- java - 正则表达式在 Java 上的工作方式与根据 regex101 的方式不同
- powershell - Powershell:如何按时间顺序批量重命名文件并按日期排序
- html - 导入数据网站,当 Xpath 或 regexpr 不工作时:将使用 JSON
- xamarin.forms - 命名空间“PdfSharp.Xamarin.Forms”中不存在类型或命名空间名称“UWP”
- java - 添加vintage junit 5时出现OutOfMemoryError错误
- google-cloud-data-fusion - Google Datafusion:每天加载多个小表
- python - Scrapy:使用 response.text 提取数据
- python - 将模型的数据输入从 (1, 5) 重塑为 (1, 3000)
- javascript - jQuery拖放+点击图片上传