基于Python循环调用Overpass API获取多国托育设施数据及报错排查
问题描述
基于Overpass-Turbo API批量获取荷兰、德国、奥地利、瑞士、法国的儿童保育设施数据,拼接请求并通过Python的requests和pandas库汇总为CSV。运行代码时出现两类问题:
error_bad_lines参数已弃用的FutureWarning- CSV解析时多条数据字段数量不匹配的跳过提示
问题分析
- 弃用警告问题:pandas新版本中
error_bad_lines参数已被移除,替代方案是使用on_bad_lines参数指定错误行的处理方式。 - 字段不匹配问题:
- 请求模板中输出字段
" 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
相关产品推荐
相关产品推荐

