在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,命名空间) 的相关文章

  • 如何使用 imaplib 获取“消息 ID”

    我尝试获取一个在操作期间不会更改的唯一 ID 我觉得UID不好 所以我认为 Message ID 是正确的 但我不知道如何获取它 我只知道 imap fetch uid XXXX 有人有解决方案吗 来自 IMAP 文档本身 IMAP4消息号
  • 通过列表理解压平列表列表

    我正在尝试使用 python 中的列表理解来展平列表 我的清单有点像 1 2 3 4 5 6 7 8 只是为了打印这个列表列表中的单个项目 我编写了这个函数 def flat listoflist for item in listoflis
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • Argparse nargs="+" 正在吃位置参数

    这是我的解析器配置的一小部分 parser add argument infile help The file to be imported type argparse FileType r default sys stdin parser
  • 如何在 pytest 中将单元测试和集成测试分开

    根据维基百科 https en wikipedia org wiki Unit testing Description和各种articles https techbeacon com devops 6 best practices inte
  • Pandas 中允许重复列

    我将一个大的 CSV 包含股票财务数据 文件分割成更小的块 CSV 文件的格式不同 像 Excel 数据透视表之类的东西 第一列的前几行包含一些标题 公司名称 ID 等在以下列中重复 因为一家公司有多个属性 而不是一家公司只有一栏 在前几行
  • 从零开始的 numpy 形状意味着什么

    好的 我发现数组的形状中可以包含 0 对于将 0 作为唯一维度的情况 这对我来说是有意义的 它是一个空数组 np zeros 0 但如果你有这样的情况 np zeros 0 100 让我很困惑 为什么这么定义呢 据我所知 这只是表达空数组的
  • 忽略 Mercurial hook 中的某些 Mercurial 命令

    我有一个像这样的善变钩子 hooks pretxncommit myhook python path to file myhook 代码如下所示 def myhook ui repo kwargs do some stuff 但在我的例子中
  • 如何计算numpy数组中元素的频率?

    我有一个 3 D numpy 数组 其中包含重复的元素 counterTraj shape 13530 1 1 例如 counterTraj 包含这样的元素 我只显示了几个元素 array 136 129 130 103 102 101 我
  • 以同步方式使用 FastAPI,如何获取 POST 请求的原始正文?

    在中使用 FastAPIsync not async模式 我希望能够接收 POST 请求的原始 未更改的正文 我能找到的所有例子都显示async代码 当我以正常同步方式尝试时 request body 显示为协程对象 当我通过发布一些内容来
  • 对图像块进行多重处理

    我有一个函数必须循环遍历图像的各个像素并计算一些几何形状 此函数需要很长时间才能运行 在 24 兆像素图像上大约需要 5 小时 但似乎应该很容易在多个内核上并行运行 然而 我一生都找不到一个有据可查 解释充分的例子来使用 Multiproc
  • Ebay api GetSellerList,解析响应 XML

    我正在使用 eBay 交易 api 来获取当前列出的卖家股票 我正在使用 GetSellerList 调用 我在解析 xml 时遇到问题 然后将其插入到网站商店中 这是 xml 请求
  • 将 JSON 对象传递给带有请求的 url

    所以 我想利用 Kenneth 的优秀请求模块 https github com kennethreitz requests 在尝试使用时偶然发现了这个问题自由库API http wiki freebase com wiki API 基本上
  • 在 pytube3 中获取 youtube 视频的标题?

    我正在尝试构建一个应用程序来使用 python 下载 YouTube 视频pytube3 但我无法检索视频的标题 这是我的代码 from pytube import YouTube yt YouTube link print yt titl
  • 如何在 python 中没有 csv.reader 迭代器的情况下解析单行 csv 字符串?

    我有一个 CSV 文件 需要重新排列和重新编码 我想跑 line line decode windows 1250 encode utf 8 在由 CSV 读取器解析和分割之前的每一行 或者我想自己迭代行 运行重新编码 并仅使用单行解析表单
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • 如何为每个屏幕添加自己的 .py 和 .kv 文件?

    我想为每个屏幕都有一个单独的 py 和 kv 文件 应通过 main py main kv 中的 ScreenManager 选择屏幕 设计应从文件 screen X kv 加载 类等应从文件 screen X py 加载 Screens
  • 您可以将操作直接应用于map/reduce/filter 中的参数吗?

    map and filter通常可以与列表理解互换 但是reduce并不那么容易被交换map and filter 此外 在某些情况下我仍然更喜欢函数语法 但是 当您需要对参数本身进行操作时 我发现自己正在经历语法体操 最终必须编写整个函数
  • 限制 django 应用程序模型中的单个记录?

    我想使用模型来保存 django 应用程序的系统设置 因此 我想限制该模型 使其只能有一条记录 极限怎么办 尝试这个 class MyModel models Model onefield models CharField The fiel
  • 具有自定义值的 Django 管理外键下拉列表

    我有 3 个 Django 模型 class Test models Model pass class Page models Model test models ForeignKey Test class Question model M

随机推荐