使用BeautifulSoup解析KML文件生成Pandas DataFrame失败的问题及文件读取方法咨询
解决KML解析与生成Pandas DataFrame的问题
看起来你的代码已经迈出了第一步,但还需要调整下逻辑来精准提取你要的数据。我帮你修改并解释下怎么实现目标:
修正后的解析代码
首先,我们需要精准定位到name为MyNodes的Folder,然后遍历其下的Placemark节点提取所需字段:
from bs4 import BeautifulSoup import pandas as pd fn = r'sampleKMLFile.kml' # 用with语句读取文件,自动处理文件关闭,更安全 with open(fn, 'r') as f: soup = BeautifulSoup(f, 'xml') # 找到目标Folder(用find而非find_all,因为我们只需要第一个匹配的文件夹) target_folder = soup.find("Folder", {"name": "MyNodes"}) # 获取该文件夹下所有的Placemark节点 placemarks = target_folder.find_all("Placemark") # 准备存储数据的列表 data_records = [] for pm in placemarks: # 提取节点名称 node_name = pm.find("name").text.strip() # 获取Camera标签下的经纬度 camera_tag = pm.find("Camera") lon = camera_tag.find("longitude").text.strip() lat = camera_tag.find("latitude").text.strip() # 也可以选择从Point的coordinates字段提取(如果Camera标签不存在时可用) # coords = pm.find("Point").find("coordinates").text.strip().split(',') # lon, lat = coords[0], coords[1] # 将数据存入字典,方便后续转成DataFrame data_records.append({ "MyNodes": node_name, "longitude": float(lon), "latitude": float(lat) }) # 生成目标DataFrame result_df = pd.DataFrame(data_records) print(result_df)
运行这段代码后,你就能得到和示例一致的DataFrame:
| MyNodes | longitude | latitude |
|---|---|---|
| Houston | -95.0 | 33.0 |
| Austin | -97.0 | 33.0 |
关键调整说明
- 文件读取:用
with open替代直接open,能自动处理文件关闭,避免资源泄漏。 - 定位目标Folder:用
find代替find_all,因为我们只需要匹配第一个名为MyNodes的文件夹,find_all会返回列表,需要额外索引才能操作。 - 字段提取:遍历每个
Placemark,分别提取name、Camera下的经纬度,转成float类型方便后续数据分析。
关于补充疑问:读取文件生成样本/计数数据
上面的代码已经包含了完整的文件读取逻辑,在此基础上可以轻松生成样本或计数数据:
生成样本数据
直接提取你需要的字段即可,比如如果只需要前2条样本:
sample_df = result_df.head(2) print(sample_df)
生成计数数据
统计MyNodes下的节点数量,或者特定条件的节点数:
# 统计MyNodes下的总节点数 total_nodes = len(placemarks) print(f"MyNodes文件夹下共有{total_nodes}个节点") # 统计纬度等于33的节点数量 lat_33_count = len(result_df[result_df['latitude'] == 33]) print(f"纬度为33的节点共有{lat_33_count}个")
内容的提问来源于stack exchange,提问作者Zanam
相关产品推荐
相关产品推荐

