You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python循环调用Overpass API获取多国托育设施数据及报错排查

问题描述

基于Overpass-Turbo API批量获取荷兰、德国、奥地利、瑞士、法国的儿童保育设施数据,拼接请求并通过Python的requests和pandas库汇总为CSV。运行代码时出现两类问题:

  • error_bad_lines参数已弃用的FutureWarning
  • CSV解析时多条数据字段数量不匹配的跳过提示
问题分析
  1. 弃用警告问题:pandas新版本中error_bad_lines参数已被移除,替代方案是使用on_bad_lines参数指定错误行的处理方式。
  2. 字段不匹配问题:
    • 请求模板中输出字段" contact:email=*"格式错误:=*是Overpass的查询条件,不是输出字段名,多余空格和错误格式会导致返回的CSV字段数量与预期不符。
    • Overpass API返回的CSV可能包含//开头的注释行,这类无效行会干扰pandas的解析逻辑。
修复后的代码
import requests
import pandas as pd
from io import StringIO

# 目标国家ISO3166-1编码列表
country_codes = ["NL", "DE", "AT", "CH", "FR"]

# 修正后的Overpass请求模板:修复contact:email字段格式,移除多余空格和错误的=*
base_request = """
[out:csv(::id,::type,"name","addr:postcode","addr:city","addr:street","addr:housenumber","website","contact:email")][timeout:600];
area["ISO3166-1"="{}"]->.a;
( node(area.a)[amenity=childcare];
  way(area.a)[amenity=childcare];
  rel(area.a)[amenity=childcare];);
out;
"""

dfs = []

for code in country_codes:
    request = base_request.format(code)
    response = requests.post("https://overpass-api.de/api/interpreter", data=request)
    
    if response.status_code == 200:
        try:
            # 替换弃用参数,添加comment参数跳过注释行,指定on_bad_lines跳过错误行
            df = pd.read_csv(
                StringIO(response.text),
                comment='//',  # 跳过以//开头的注释行
                on_bad_lines='skip'  # 替代原error_bad_lines=False的功能
            )
        except pd.errors.ParserError as e:
            print(f"{code}数据解析错误: {e}")
            continue
        
        df['country_code'] = code
        dfs.append(df)
    else:
        print(f"{code}数据请求失败,状态码: {response.status_code}")

# 合并所有数据并保存
if dfs:
    result_df = pd.concat(dfs, ignore_index=True)
    result_df.to_csv("merged_childcare_data.csv", index=False)
    print("数据合并完成,已保存为merged_childcare_data.csv")
else:
    print("未获取到有效数据")
关键修改说明
  • 请求模板修正:将" contact:email=*"改为"contact:email",明确输出字段名,与查询条件区分开,确保返回的CSV字段数量匹配。
  • pandas参数更新:用on_bad_lines='skip'替代error_bad_lines=False,彻底解决弃用警告,同时保留跳过错误行的功能。
  • 注释行处理:添加comment='//'参数,自动过滤Overpass返回的注释行,避免无效行引发的解析异常。

内容的提问来源于stack exchange,提问作者zero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:59:54