在Python中解析Google Earth KML文件(lxml,命名空间)

2024-05-09

我正在尝试解析.kml https://developers.google.com/kml/documentation/使用 xml 模块将文件导入到 Python 中(在 BeautifulSoup 中未能实现此功能,我将其用于 HTML)。

由于我是第一次做,所以就关注官方了tutorial http://lxml.de/1.3/tutorial.html一切都很顺利,直到我尝试构造一个迭代器来通过根迭代提取数据:

from lxml import etree
tree=etree.parse('kmlfile')

这里是example http://lxml.de/1.3/tutorial.html#tree-iteration从我试图模仿的教程中:

如果您知道您只对单个标签感兴趣,则可以将其名称传递给 getiterator() 以让它为您过滤:

for element in root.getiterator("child"):
    print element.tag, '-', element.text

我想获取“地标”下的所有数据,所以我尝试了

for i in tree.getiterterator("Placemark"):
    print i, type(i)

这没有给我任何东西。起作用的是:

for i in tree.getiterterator("{http://www.opengis.net/kml/2.2}Placemark"):
    print i, type(i)

我不明白这是怎么发生的。 www.opengis.net 在文档开头的标签中列出(kml xmlns =“http://www.opengis.net/kml/2.2”...),但我不明白

  • {} 中的部分与我的具体示例有何关系

  • 为什么它与教程不同

  • 我做错了什么

任何帮助深表感谢!


这是我的解决方案。 所以,最重要的就是读书this https://msdn.microsoft.com/en-us/library/aa468565.aspx正如托马拉克发布的。这是对命名空间的很好的描述并且很容易理解。

我们将使用XPath https://www.w3schools.com/xml/xpath_intro.asp导航 XML 文档。它的表示法类似于文件系统,其中父级和子级由斜杠分隔/。语法已解释here http://www.w3schools.com/xsl/xpath_syntax.asp,但请注意,某些命令对于lxml实现 http://lxml.de/api/lxml.etree.XPath-class.html.

###问题

我们的目标是提取城市名称:内容<name>这是在<Placemark>。这是相关的 XML:

<Placemark> <name>CITY NAME</name> 

与我上面发布的非功能代码等效的 XPath 是:

tree=etree.parse('kml document')
result=tree.xpath('//Placemark/name/text()')

哪里的text()需要部分来获取该位置中包含的文本//Placemark/name.

现在,正如托马拉克指出的那样,这不起作用,因为这两个节点的名称实际上是{http://www.opengis.net/kml/2.2}Placemark and {http://www.opengis.net/kml/2.2}name。大括号中的部分是默认命名空间。它没有出现在实际文档中(这让我很困惑),但它是在 XML 文档的开头定义的,如下所示:

xmlns="http://www.opengis.net/kml/2.2"

###解决方案

我们可以通过设置为 xpath 提供命名空间namespaces争论:

xpath(X, namespaces={prefix: namespace})

对于具有实际前缀的命名空间来说,这很容易,例如在本文档中<gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode>哪里的gx前缀在文档中定义为xmlns:gx="http://www.google.com/kml/ext/2.2".

然而,Xpath 不理解默认命名空间是什么(参见docs http://lxml.de/xpathxslt.html)。因此,我们需要欺骗它,就像上面托马拉克建议的那样:我们为默认值发明一个前缀并将其添加到我们的搜索词中。例如,我们可以将其称为 kml。这段代码实际上起到了作用:

tree.xpath('//kml:Placemark/kml:name/text()', namespaces={"kml":"http://www.opengis.net/kml/2.2"})

The tutorial http://lxml.de/xpathxslt.html提到还有一个ETXPath http://lxml.de/api/lxml.etree.ETXPath-class.html方法,其工作方式与 Xpath 类似,只不过将名称空间写在大括号中而不是在字典中定义它们。因此,输入的样式为{http://www.opengis.net/kml/2.2}Placemark.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中解析Google Earth KML文件(lxml,命名空间) 的相关文章

  • 如何使用pycaffe重构caffe网络

    我想要的是 加载网络后 我将分解一些特定的图层并保存新的网络 例如 原网 数据 gt conv1 gt conv2 gt fc1 gt fc2 gt softmax New net 数据 gt conv1 1 gt conv1 2 gt c
  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • 使用 Django 的 post_save() 信号

    我有两张桌子 class Advertisement models Model created at models DateTimeField auto now add True author email models EmailField
  • 如何用 python 和 sympy 解决多元不等式?

    我对使用 python 和 Sympy 还很陌生 并且遇到了使用 sympy 解决多元不等式的问题 假设我的文件中有很多函数 如下所示 cst sqrt x 2 cst exp sqrt cst x 1 4 log log sqrt cst
  • 获取单个方程的脚本

    在文本文件中输入 a 2 8 b 3 9 c 4 8 d 5 9 e a b f c d g 0 6 h 1 7 i e g j f h output i j 期望的输出 输出 2 8 3 9 0 6 4 8 5 9 1 7 如果输入文件名
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • VSCode pytest 测试发现失败

    Pytest 测试发现失败 用户界面指出 Test discovery error please check the configuration settings for the tests 输出窗口显示 Test Discovery fa
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • 如何为多组精灵创建随机位置?

    我尝试使用 blit 和 draw 方法进行 for 循环 并为 PlayerSprite 和 Treegroup 使用不同的变量 for PlayerSprite in Treegroup surface blit PlayerSprit
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • Python While 循环,and (&) 运算符不起作用

    我正在努力寻找最大公因数 我写了一个糟糕的 运算密集型 算法 它将较低的值减一 使用 检查它是否均匀地划分了分子和分母 如果是 则退出程序 但是 我的 while 循环没有使用 and 运算符 因此一旦分子可整除 它就会停止 即使它不是正确
  • 在wxpython中使用wx.TextCtrl并在按钮单击后显示数据的简单示例 - wx新手

    我正在学习 python 并尝试使用 wxpython 进行 UI 开发 也没有 UI exp 我已经能够创建一个带有面板 按钮和文本输入框的框架 我希望能够在文本框中输入文本 并让程序在单击按钮后对输入框中的文本执行操作 我可以获得一些关
  • LinearLayout:防止最后一个孩子被之前的大文本视图推出或挤压

    我有一个LinearLayout里面有两个孩子 第一个是TextView对于动态内容 第二个是一个按钮 我的问题是按钮被推出其父级或被挤压到不再可见的程度 我想要TextView认识到其父母与第二个孩子一起没有更多空间 并开始新的一行 而不
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • 是否可以强制浮点数的指数或有效数匹配另一个浮点数(Python)?

    这是我前几天试图解决的一个有趣的问题 是否可以强制一个的有效数或指数float与另一个人一样float在Python中 出现这个问题是因为我试图重新调整一些数据 以便最小值和最大值与另一个数据集匹配 然而 我重新调整后的数据略有偏差 大约小
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐