python - Lxml 和 python : iterate only over existing elements

标签 python xpath namespaces lxml

我有一个包含 2 个地标的 KML 文件:
测试 1 和测试 2。

<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)

会给我那些 list
[Test1, Test2]

[19]
虽然我正在寻找一种解决方案来获得类似的东西(如果规模不存在,则输出“0”):
[Test1, Test2]

[0, 19]
任何解决方案或想法?我一直在尝试遍历解析后的 XML,但是 2 个不同的命名空间(kml 和 mwm)使我在论坛上找到的解决方案变得不可能......
非常感谢您的帮助!

最佳答案

尝试以下方法:

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)
输出:
(['Test1', 'Test2'], ['0', '19'])

关于python - Lxml 和 python : iterate only over existing elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65906998/

相关文章:

如果在 c 中的结构内定义,枚举的范围是否有限

c# - 为什么 Visual Studio 向我的命名空间添加一个 at 符号 (@)?

python - Python 和 Selenium 的授权异常

python - CX_Oracle CTE 执行

JavascriptExecutor 使用 document.evaluate xpath 更改 className

xml - XPath 查询以选择没有特定属性的特定值的任何后代

python - None 背后的概念是什么?

python - 如何在同一行上对齐 2 个工具栏,一个左对齐,一个右对齐?

xml - 我的 xmlstarlet update 命令有什么问题?

c++ - 具有类参数的函数从命名空间中泄漏?