Python:拆分URL的一部分以在函数中使用

时间:2018-11-26 21:15:11

标签: python curl

我了解在处理拆分python URL方面已经有很多答案。但是,我想分割一个URL,然后在一个函数中使用它。

我在python中使用curl请求:

r = requests.get('http://www.datasciencetoolkit.org/twofishes?query=New%York')
r.json()

其中提供以下内容:

{'interpretations': [{'what': '',
  'where': 'new york',
  'feature': {'cc': 'US',
    'geometry': {'center': {'lat': 40.742185, 'lng': -73.992602},
     ......
     # (lots more, but not needed here)

我希望能够呼叫任何城市/位置,并且想分隔latlng。例如,我想调用一个可以输入任何城市的函数,并且该函数以纬度和经度作为响应。有点像this question(使用R)。

这是我的尝试:

import requests

def lat_long(city):
    geocode_result = requests.get('http://www.datasciencetoolkit.org/twofishes?query= "city"')

我该如何解析它,以便只用城市调用该函数?

2 个答案:

答案 0 :(得分:1)

以您的示例为例,我建议使用正则表达式和字符串插值。这个答案假设API每次都以相同的方式返回数据。

import re, requests

def lat_long(city: str) -> tuple:
    # replace spaces with escapes
    city = re.sub('\s', '%20', city)
    res = requests.get(f'http://www.datasciencetoolkit.org/twofishes?query={city}')

    data = res.json()
    geo = data['interpretations'][0]['feature']['geometry']['center']

    return (geo['lat'], geo['lng'])

答案 1 :(得分:0)

您可以在“解释”列表中循环查找城市名称,并在找到正确的城市时返回坐标。

 public static void Register(HttpConfiguration config)
    {
        // Json settings
        config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;

        // DIES HERE - when hitting DefaultSettings
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Formatting = Newtonsoft.Json.Formatting.Indented,
            NullValueHandling = NullValueHandling.Ignore,
        };

        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}