Python脚本实战:一键将百度地图收藏夹转为高德地图可用JSON(附完整代码)
你是否也曾为在不同地图应用间迁移收藏夹而头疼?手动复制粘贴几十甚至上百个地址,不仅耗时费力,还容易出错。作为一名经常在不同城市间穿梭的开发者,我曾在项目调研阶段积累了大量的地点收藏,当团队协作工具切换到另一平台时,数据迁移就成了一个现实的痛点。今天,我们就来聊聊如何用Python写一个轻巧的脚本,自动化完成从百度地图到高德地图的收藏夹格式转换,把时间留给更有价值的事情。
这个脚本的核心思路非常直接:解析百度地图导出的HTML文件,提取出结构化的地址信息,然后将其转换为高德地图易于处理的JSON格式。整个过程只依赖Python标准库,无需安装任何第三方包,真正做到开箱即用。无论你是想快速迁移自己的个人收藏,还是为团队开发一个小型的数据转换工具,接下来的内容都会提供清晰的路径和可落地的代码。
1. 理解数据源:百度地图收藏夹的HTML结构
在动手写代码之前,我们得先搞清楚“敌人”长什么样。百度地图允许用户将收藏夹分享或导出,通常会生成一个HTML文件。用文本编辑器打开这个文件,你会发现它并不是一个简单的地址列表,而是一个包含了完整HTML标签、CSS样式甚至JavaScript的网页。
关键在于找到数据所在的模式。经过分析,有效的地址信息通常包裹在特定的HTML标签结构中。一个典型的收藏项看起来是这样的:
<li class="item">
...其他标签...
<p class="name">公司附近的川菜馆</p>
...其他标签...
<p class="address">北京市海淀区中关村大街xx号</p>
...其他标签...
</li>
这里有几个要点需要注意:
li标签的class属性通常是"item",这标识了一个独立的收藏条目。- 地址的名称藏在
class="name"的<p>标签里。 - 具体的详细地址则藏在
class="address"的<p>标签里。
但是,事情并不总是这么完美。你可能会遇到一些“陷阱”:
- HTML实体编码:像
"(代表双引号")这样的字符会直接出现在文本中,如果不去处理,转换后的JSON格式可能会出错。 - URL编码:中文字符或特殊符号有时会被编码,例如“上海”可能显示为
%E4%B8%8A%E6%B5%B7。 - 无效数据:有些收藏可能只是一个手动在地图上点击的点,其地址字段显示为“地图上的点”,这类数据没有具体的文字地址,对于后续的转换和地理编码没有意义,需要过滤掉。
提示:不同时期或不同方式导出的HTML,其标签的class名称可能会有细微差异。在运行脚本前,最好先用编辑器检查一下你的HTML文件结构,确保正则表达式能正确匹配。
了解了数据结构,我们就可以设计脚本的第一个核心函数了:从HTML中精准地“挖”出我们需要的信息。
2. 核心实现:三函数构建转换流水线
整个转换流程可以抽象为一条清晰的生产线:提取 -> 转换 -> 输出。我们将用三个函数来分别对应这三个环节,确保每个函数职责单一,代码既容易理解也方便后续维护或扩展。
2.1 数据提取:extract_addresses_from_html
这个函数是整个脚本的起点,任务是从杂乱的HTML中提取出干净的结构化数据。我们选择使用正则表达式来完成模式匹配,因为它足够灵活,且Python的 re 模块是标准库的一部分。
import re
from urllib.parse import unquote
def extract_addresses_from_html(file_path):
"""
从百度地图收藏夹HTML文件中提取名称和地址。
参数:
file_path (str): HTML文件的路径。
返回:
list: 一个字典列表,每个字典包含'name'和'address'键。
"""
with open(file_path, 'r', encoding='utf-8') as f:
html_content = f.read()
# 匹配收藏项的正则表达式模式
# re.DOTALL 标志让 . 也能匹配换行符,应对标签跨行的情况
pattern = r'<li class="item">.*?<p class="name">(.*?)</p>.*?<p class="address">(.*?)</p>.*?</li>'
matches = re.findall(pattern, html_content

857

被折叠的 条评论
为什么被折叠?



