百度地图收藏地址提取与格式转换工具 说明文档

一、工具概述

该工具是一款基于 Python 开发的轻量级脚本,核心功能为从百度地图收藏夹导出的 HTML 文件中提取地址信息,并将其转换为适配高德地图的格式(含后续对接高德 API 的扩展预留),最终以 JSON 文件输出,简化百度地图到高德地图的收藏地址迁移流程,无需手动逐个整理地址。

二、依赖环境

  1. Python 版本 :支持 Python 3.6 及以上版本(需兼容urllib.parse.unquoterejson标准库)。
  2. 依赖库 :仅使用 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。
处理逻辑
  1. 读取 HTML 文件:以 UTF-8 编码打开并读取指定路径的 HTML 文件内容。
  2. 正则匹配数据 :使用正则表达式r'<li class="item">.*?<p class="name">(.*?)</p>.*?<p class="address">(.*?)</p>.*?</li>'匹配 HTML 中 "收藏项" 节点,提取<p class="name">标签内的 "地址名称" 和<p class="address">标签内的 "详细地址"。
    • 注:re.DOTALL参数确保正则中的.能匹配换行符,避免因 HTML 节点换行导致匹配失败。
  3. 数据清洗
    • unquote()解码 URL 编码字符(如将%E4%B8%8A%E6%B5%B7解码为 "上海")。
    • replace('&quot;', '"')将 HTML 转义字符&quot;还原为双引号"
    • 过滤掉地址为 "地图上的点" 的无效数据(此类数据无实际地址信息)。
  4. 返回结果 :返回列表,列表中每个元素为字典,格式为[{"name": "地址名称", "address": "详细地址"}, ...]
返回值
  • locations(list):包含有效地址信息的列表,元素为 "名称 - 地址" 字典。

2. convert_to_gaode_format(locations)

功能

将百度地图提取的地址数据,转换为适配高德地图的格式,预留经纬度(lat/lng)扩展位(用于后续对接高德 API)。

参数
  • locations(list):extract_addresses_from_html函数返回的地址列表,格式为[{"name": "...", "address": "..."}, ...]
处理逻辑
  1. 格式转换 :遍历输入的地址列表,为每个地址添加gaode_formatted_address字段(暂与address字段值一致,用于后续高德地图格式适配)。
  2. 预留扩展位 :在返回的字典中预留lat(纬度)和lng(经度)字段注释,提示后续可通过高德 "地理编码 API" 获取经纬度并补充(需自行申请高德 API 密钥)。
  3. 返回结果:返回适配高德格式的地址列表。
返回值
  • 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",默认保存在脚本运行目录)。
处理逻辑
  1. 写入 JSON 文件 :以 UTF-8 编码打开文件,使用json.dump将数据写入。
    • ensure_ascii=False:确保中文不被转为 Unicode 编码(如保留 "上海" 而非"\u4e0a\u6d77")。
    • indent=2:以 2 个空格缩进格式化 JSON 文件,提升可读性。
返回值

无返回值,仅生成 JSON 文件。

四、使用流程

1. 准备百度地图 HTML 文件

  1. 打开百度地图官网(map.baidu.com),登录账号后进入 "我的收藏"。
  2. 点击 "分享" 或 "导出" 按钮(不同版本界面可能不同),将收藏夹导出为 HTML 文件,命名为收藏夹分享.html(或自定义名称)。
  3. 将 HTML 文件与 Python 脚本放在同一目录(或记录文件的完整路径)。

2. 运行脚本

  1. 打开 Python 环境(如 PyCharm、VS Code 或命令行),运行脚本。
  2. 脚本自动执行以下步骤:
    • 调用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 密钥)。

五、常见问题

  1. 正则匹配不到数据?

    • 检查 HTML 文件中收藏项的标签结构是否为<li class="item">包含<p class="name"><p class="address">,若百度地图更新界面导致标签变化,需同步修改正则表达式中的类名或标签名。
    • 确保 HTML 文件编码为 UTF-8,若为其他编码(如 GBK),需在open函数中指定encoding="gbk"
  2. JSON 文件中文显示乱码?

    • 脚本中save_to_json已设置ensure_ascii=False,若仍乱码,检查打开 JSON 文件的工具是否以 UTF-8 编码读取(如记事本需选择 "编码→UTF-8" 打开)。
  3. 提示 "文件不存在"?

    • 确认extract_addresses_from_htmlfile_path参数是否正确,若文件不在脚本目录,需填写完整路径(如"D:/下载/收藏夹分享.html")。

六、扩展建议

  1. 对接高德地理编码 API :在convert_to_gaode_format函数中,添加调用高德 "地理编码 API" 的代码(需传入address字段),获取经纬度后补充到latlng字段,示例代码框架:

    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, lng
        return None, None
  2. 批量导入高德收藏:获取经纬度后,调用高德 "收藏夹添加 API",实现地址的自动批量导入,无需手动操作。

python 复制代码
import re
from urllib.parse import unquote
import json

def 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 address
    item_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 text
        name = unquote(name).replace('&quot;', '"')
        address = unquote(address).replace('&quot;', '"')
        
        # Skip generic "地图上的点" entries as they're not useful
        if address != "地图上的点":
            locations.append({
                'name': name,
                'address': address
            })
    
    return locations

def convert_to_gaode_format(locations):
    """
    Convert locations to Gaode-compatible format
    In 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 here
    gaode_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_locations

def 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 file
    locations = extract_addresses_from_html('收藏夹分享.html')
    
    # Convert to Gaode format
    gaode_locations = convert_to_gaode_format(locations)
    
    # Save to JSON file
    save_to_json(gaode_locations, 'gaode_locations.json')
    
    # Print summary
    print(f"Processed {len(gaode_locations)} locations:")
    for loc in gaode_locations[:5]:  # Show first 5
        print(f"- {loc['name']}: {loc['address']}")
    
    if len(gaode_locations) > 5:
        print("...")
相关推荐
William_cl3 小时前
C# MVC 修复DataTable时间排序以及中英文系统的时间筛选问题
开发语言·c#·mvc
running thunderbolt3 小时前
项目---网络通信组件JsonRpc
linux·服务器·c语言·开发语言·网络·c++·性能优化
玩毛线的包子3 小时前
Android Gradle学习(十三)- 配置读取和文件写入
java
小马学嵌入式~3 小时前
堆排序原理与实现详解
开发语言·数据结构·学习·算法
青岛少儿编程-王老师3 小时前
CCF编程能力等级认证GESP—C++6级—20250927
java·c++·算法
SundayBear3 小时前
Qt 开发修炼指南:从入门到通透的实战心法
开发语言·qt·嵌入式
一條狗4 小时前
学习日报 20251007|深度解析:基于 Guava LoadingCache 的优惠券模板缓存设计与实现
java·oracle·loadingcache
Miraitowa_cheems4 小时前
LeetCode算法日记 - Day 64: 岛屿的最大面积、被围绕的区域
java·算法·leetcode·决策树·职场和发展·深度优先·推荐算法
_w_z_j_4 小时前
C++----bitmap位图的使用
开发语言·c++