Python解析KML文件时findall无法获取Placemark元素的问题
解决Python读取KML文件时findall返回空列表的问题
问题原因
你的代码里有两处命名空间使用错误:
- XPath表达式写法不对:你用了
".//{kml}Placemark",这不是lxml中使用命名空间前缀的正确格式,应该用前缀:元素名的形式。 - 查找
name元素时没加命名空间前缀:KML里的所有元素都属于同一个命名空间,直接找name会匹配不到。
修正后的代码
def scan(filename): from lxml import etree tree = etree.parse(open(filename, encoding='utf-8')) root = tree.getroot() namespaces = {'kml': 'http://www.opengis.net/kml/2.2'} # 用前缀:元素名的格式写XPath placemarks = root.findall(".//kml:Placemark", namespaces) for placemark in placemarks: # 查找name元素也要带上命名空间前缀 name_text = placemark.findtext('.//kml:name', namespaces=namespaces) if name_text: print(name_text) return
额外验证步骤
如果还是找不到元素,可以先打印根元素的标签确认命名空间是否匹配:
print(root.tag)
如果输出是{http://www.opengis.net/kml/2.2}kml,说明命名空间定义正确,上面的代码就能正常工作。
内容的提问来源于stack exchange,提问作者user1791983
相关产品推荐
相关产品推荐

