目录
1.使用get函数提取(提取的数据必须是字典格式,不然不能用)
2.使用jsonpath提取,适用于json的结果(前提是下载这个库,并且导包, 下载使用pip install jsonpath下载就可以了):返回的是一个列表
本文示例的响应结果:
{'reason': '查询成功', 'result': [{'id': '1', 'province': '安徽'}, {'id': '2', 'province': '澳门'}, {'id': '3', 'province': '北京'}, {'id': '4', 'province': '福建'}, {'id': '5', 'province': '甘肃'}, {'id': '6', 'province': '广东'}, {'id': '7', 'province': '广西'}, {'id': '8', 'province': '贵州'}, {'id': '9', 'province': '海南'}, {'id': '10', 'province': '河北'}, {'id': '11', 'province': '河南'}, {'id': '12', 'province': '黑龙江'}, {'id': '13', 'province': '湖北'}, {'id': '14', 'province': '湖南'}, {'id': '15', 'province': '吉林'}, {'id': '16', 'province': '江苏'}, {'id': '17', 'province': '江西'}, {'id': '18', 'province': '辽宁'}, {'id': '19', 'province': '内蒙古'}, {'id': '20', 'province': '宁夏'}, {'id': '21', 'province': '青海'}, {'id': '22', 'province': '山东'}, {'id': '23', 'province': '山西'}, {'id': '24', 'province': '陕西'}, {'id': '25', 'province': '上海'}, {'id': '26', 'province': '四川'}, {'id': '27', 'province': '台湾'}, {'id': '28', 'province': '天津'}, {'id': '29', 'province': '西藏'}, {'id': '30', 'province': '香港'}, {'id': '31', 'province': '新疆'}, {'id': '32', 'province': '云南'}, {'id': '33', 'province': '浙江'}, {'id': '34', 'province': '重庆'}], 'error_code': 0}
1.使用get函数提取(提取的数据必须是字典格式,不然不能用)
当我们获取到json格式的响应结果时,我们可以使用get函数直接进行提取(前提必须是字典格式可以使用type函数进行查看),如果像下面这种里面包含列表的情况,我们需要使用[]下标进行定位,下面的代码就表示取列表中第一个字典中id的值。
res_data1 = response1.json()
id_1 = res_data1.get("result")[0].get("id")
#或者
id_1 = res_data1["result"][0]["id"]
结果
如果是下面这种情况,则可以直接一直使用get函数
day_wind_comp = response3.json().get("result").get("day_wind_comp")
结果
2.使用jsonpath提取,适用于json的结果(前提是下载这个库,并且导包, 下载使用pip install jsonpath下载就可以了):返回的是一个列表
jsonpath表达式的规则:
1) $ 根节点(必须以$开头)
2) . 子节点
3) .. 递归取子节点
id_1_1 = jsonpath.jsonpath(res_data1,"$.result")
id_1_1_1 = jsonpath.jsonpath(res_data1,"$..id")
我们通过结果来进行分析
第一行表示从根节点开始,获取到result这个子节点的值,因为result本身是一个列表,所以这个结果是列表嵌套列表,所以需要在末尾加上[index][index][key]才能提取到对应的值。
第二行表示从根节点开始,递归取到子节点下所有的键为id的值,然后是以列表的格式输出,需要第几个id就用[]取值就可以了。
3.使用正则表达式提取,适用于文本类型的结果(需要导包)
res = requests.get("https://www.baidu.com")
print(res.text)
c = re.search('name="tj_login" class="(.*?)"',res.text).group(1)
d = re.findall('name="tj_login" class="(.*?)"',res.text)
search表示只匹配一个,findall表示匹配多个
re.search(pattern, string)
函数在给定的字符串中搜索第一个匹配指定模式的位置。如果找到匹配,它返回一个匹配对象。当在匹配对象上调用 group()
方法时,它返回实际匹配的子字符串,如果没有匹配到则返回None。group()
方法还可以接受一个参数 group(index)
,以提取具体的捕获组,如果模式中使用了多个括号定义了多个组。索引 0 表示整个匹配,而索引 1 及以后表示相应的捕获组。
这里也可以使用[]进行索引提取
re.search('name="tj_login" class="(.*?)"',res.text)[1]
findall()方法返回的则是一个列表
如有错误欢迎大佬们指正