百度地图收藏地址提取与格式转换工具 说明文档
一、工具概述
该工具是一款基于 Python 开发的轻量级脚本,核心功能为从百度地图收藏夹导出的 HTML 文件中提取地址信息,并将其转换为适配高德地图的格式(含后续对接高德 API 的扩展预留),最终以 JSON 文件输出,简化百度地图到高德地图的收藏地址迁移流程,无需手动逐个整理地址。
二、依赖环境
- Python 版本:支持 Python 3.6 及以上版本(需兼容
urllib.parse.unquote
、re
、json
标准库)。 - 依赖库:仅使用 Python 内置标准库,无需额外安装第三方库,具体包括:
re
:用于通过正则表达式匹配 HTML 中的地址数据。urllib.parse.unquote
:用于解码 HTML 中 URL 编码的特殊字符(如%20
、"
等)。json
:用于将提取并转换后的地址数据保存为 JSON 文件。
三、核心函数说明
1. extract_addresses_from_html(file_path)
功能
从百度地图收藏夹导出的 HTML 文件中,提取收藏地址的 “名称” 和 “地址” 信息,并进行数据清洗。
参数
file_path
(str):百度地图收藏夹 HTML 文件的路径(如"C:/文档/收藏夹分享.html"
),需确保文件编码为 UTF-8。
处理逻辑
- 读取 HTML 文件:以 UTF-8 编码打开并读取指定路径的 HTML 文件内容。
- 正则匹配数据:使用正则表达式
r'<li class="item">.*?<p class="name">(.*?)</p>.*?<p class="address">(.*?)</p>.*?</li>'
匹配 HTML 中 “收藏项” 节点,提取<p class="name">
标签内的 “地址名称” 和<p class="address">
标签内的 “详细地址”。- 注:
re.DOTALL
参数确保正则中的.
能匹配换行符,避免因 HTML 节点换行导致匹配失败。
- 注:
- 数据清洗:
- 用
unquote()
解码 URL 编码字符(如将%E4%B8%8A%E6%B5%B7
解码为 “上海”)。 - 用
replace('"', '"')
将 HTML 转义字符"
还原为双引号"
。 - 过滤掉地址为 “地图上的点” 的无效数据(此类数据无实际地址信息)。
- 用
- 返回结果:返回列表,列表中每个元素为字典,格式为
[{"name": "地址名称", "address": "详细地址"}, ...]
。
返回值
locations
(list):包含有效地址信息的列表,元素为 “名称 - 地址” 字典。
2. convert_to_gaode_format(locations)
功能
将百度地图提取的地址数据,转换为适配高德地图的格式,预留经纬度(lat/lng)扩展位(用于后续对接高德 API)。
参数
locations
(list):extract_addresses_from_html
函数返回的地址列表,格式为[{"name": "...", "address": "..."}, ...]
。
处理逻辑
- 格式转换:遍历输入的地址列表,为每个地址添加
gaode_formatted_address
字段(暂与address
字段值一致,用于后续高德地图格式适配)。 - 预留扩展位:在返回的字典中预留
lat
(纬度)和lng
(经度)字段注释,提示后续可通过高德 “地理编码 API” 获取经纬度并补充(需自行申请高德 API 密钥)。 - 返回结果:返回适配高德格式的地址列表。
返回值
gaode_locations
(list):适配高德地图的地址列表,元素格式为[{"name": "地址名称", "address": "详细地址", "gaode_formatted_address": "详细地址"}, ...]
。
3. save_to_json(data, filename)
功能
将转换后的地址数据保存为 JSON 文件,确保中文正常显示且格式易读。
参数
data
(list):待保存的地址数据(通常为convert_to_gaode_format
返回的gaode_locations
列表)。filename
(str):输出 JSON 文件的路径和名称(如"gaode_locations.json"
,默认保存在脚本运行目录)。
处理逻辑
- 写入 JSON 文件:以 UTF-8 编码打开文件,使用
json.dump
将数据写入。ensure_ascii=False
:确保中文不被转为 Unicode 编码(如保留 “上海” 而非"\u4e0a\u6d77"
)。indent=2
:以 2 个空格缩进格式化 JSON 文件,提升可读性。
返回值
无返回值,仅生成 JSON 文件。
四、使用流程
1. 准备百度地图 HTML 文件
- 打开百度地图官网(map.baidu.com),登录账号后进入 “我的收藏”。
- 点击 “分享” 或 “导出” 按钮(不同版本界面可能不同),将收藏夹导出为 HTML 文件,命名为
收藏夹分享.html
(或自定义名称)。 - 将 HTML 文件与 Python 脚本放在同一目录(或记录文件的完整路径)。
2. 运行脚本
- 打开 Python 环境(如 PyCharm、VS Code 或命令行),运行脚本。
- 脚本自动执行以下步骤:
- 调用
extract_addresses_from_html("收藏夹分享.html")
提取地址。 - 调用
convert_to_gaode_format
转换为高德格式。 - 调用
save_to_json
生成gaode_locations.json
文件。 - 在控制台打印处理结果:显示总处理数量及前 5 条地址示例(超过 5 条时显示 “...”)。
- 调用
3. 后续操作
- 打开
gaode_locations.json
文件,可直接查看或复制地址信息,手动在高德地图中添加收藏。 - 若需批量导入高德地图,可基于该 JSON 文件对接高德 “地理编码 API” 获取经纬度后,再调用高德 “收藏夹 API” 实现批量添加(需自行申请高德开发者账号及 API 密钥)。
五、常见问题
-
正则匹配不到数据?
- 检查 HTML 文件中收藏项的标签结构是否为
<li class="item">
包含<p class="name">
和<p class="address">
,若百度地图更新界面导致标签变化,需同步修改正则表达式中的类名或标签名。 - 确保 HTML 文件编码为 UTF-8,若为其他编码(如 GBK),需在
open
函数中指定encoding="gbk"
。
- 检查 HTML 文件中收藏项的标签结构是否为
-
JSON 文件中文显示乱码?
- 脚本中
save_to_json
已设置ensure_ascii=False
,若仍乱码,检查打开 JSON 文件的工具是否以 UTF-8 编码读取(如记事本需选择 “编码→UTF-8” 打开)。
- 脚本中
-
提示 “文件不存在”?
- 确认
extract_addresses_from_html
的file_path
参数是否正确,若文件不在脚本目录,需填写完整路径(如"D:/下载/收藏夹分享.html"
)。
- 确认
六、扩展建议
- 对接高德地理编码 API:在
convert_to_gaode_format
函数中,添加调用高德 “地理编码 API” 的代码(需传入address
字段),获取经纬度后补充到lat
和lng
字段,示例代码框架:python
运行
import requests def get_gaode_latlng(address, api_key):url = f"https://restapi.amap.com/v3/geocode/geo?address={address}&key={api_key}"response = requests.get(url)data = response.json()if data["status"] == "1" and len(data["geocodes"]) > 0:lng, lat = data["geocodes"][0]["location"].split(",")return lat, lngreturn None, None
- 批量导入高德收藏:获取经纬度后,调用高德 “收藏夹添加 API”,实现地址的自动批量导入,无需手动操作。
import re
from urllib.parse import unquote
import jsondef extract_addresses_from_html(file_path):"""Extract addresses from Baidu favorities HTML file"""with open(file_path, 'r', encoding='utf-8') as f:content = f.read()# Pattern to match items with name and addressitem_pattern = r'<li class="item">.*?<p class="name">(.*?)</p>.*?<p class="address">(.*?)</p>.*?</li>'items = re.findall(item_pattern, content, re.DOTALL)locations = []for name, address in items:# Clean up the textname = unquote(name).replace('"', '"')address = unquote(address).replace('"', '"')# Skip generic "地图上的点" entries as they're not usefulif address != "地图上的点":locations.append({'name': name,'address': address})return locationsdef convert_to_gaode_format(locations):"""Convert locations to Gaode-compatible formatIn a full implementation, this would call Gaode's API to geocode addresses"""# For now, we're just returning the locations as-is# In a real application, you would call Gaode's geocoding API heregaode_locations = []for loc in locations:gaode_locations.append({'name': loc['name'],'address': loc['address'],# In a full implementation, you would add lat/lng from Gaode API'gaode_formatted_address': loc['address'] })return gaode_locationsdef save_to_json(data, filename):"""Save data to JSON file"""with open(filename, 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=2)if __name__ == "__main__":# Extract locations from HTML filelocations = extract_addresses_from_html('收藏夹分享.html')# Convert to Gaode formatgaode_locations = convert_to_gaode_format(locations)# Save to JSON filesave_to_json(gaode_locations, 'gaode_locations.json')# Print summaryprint(f"Processed {len(gaode_locations)} locations:")for loc in gaode_locations[:5]: # Show first 5print(f"- {loc['name']}: {loc['address']}")if len(gaode_locations) > 5:print("...")