程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python爬蟲——JsonPath解析方式

編輯:Python

Python爬蟲——JsonPath解析方式

1、JsonPath簡介

JSONPath 是一個類似 XPath 的 JSON 工具,可以從JSON文檔中提取指定信息,並且JSONPath 提供多種語言實現版本,包括:JavaScript、Python、PHP和Java。

JSONPath 表達式始終引用 JSON 結構,就像 XPath 表達式與 XML/HTML文檔結合使用一樣。

JsonPath 和 XPath 的比較 :

  • JsonPath 只能解析本地的文件,不能解析服務器上的文件
  • JsonPath 結構清晰,可讀性高,復雜度低,非常容易匹配

JsonPath 與 XPath 的語法對比如下圖所示:

JSONPath 官方文檔

2、JsonPath的安裝

JsonPath安裝位置:Python安裝目錄的Scripts文件夾下

安裝命令:pip install jsonpath

如圖所示下載成功:

3、jsonpath的使用

使用實例一:以全國城市的JSON文件為例

全國城市的JSON文件地址:http://www.lagou.com/lbs/getAllCitySearchLabels.json,需要保存JSON文件到本地。

1、獲取以字母A為開頭的所有城市名稱

import json
import jsonpath
# 讀取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
# 獲取所有 A[*]
nameA_list = jsonpath.jsonpath(city_json,'$.content.data.allCitySearchLabels.A[*].name')
# 獲取下標為2的數據 A[2],[0]:獲得列表的內容
name2 = jsonpath.jsonpath(city_json,'$.content.data.allCitySearchLabels.A[2].name')[0]
print(nameA_list)
print(name2)

執行結果:jsonpath解析返回的數據是列表類型

['安陽', '安慶', '鞍山', '阿克蘇', '安順', '安康', '澳門', '阿拉爾', '阿裡地區', '阿拉善盟']
鞍山

2、獲取所有城市的名稱

import json
import jsonpath
# 讀取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
# 獲取所有城市的名稱和編碼code
name_list = jsonpath.jsonpath(city_json,'$..name')
code_list = jsonpath.jsonpath(city_json,'$..code')
print(name_list)
print(code_list)

3、獲取以字母B為開頭的最後一個城市和名稱

import json
import jsonpath
# 讀取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
name_list = jsonpath.jsonpath(city_json,'$..B[(@.length-1)]')
name = jsonpath.jsonpath(city_json,'$..B[(@.length-1).name]')
print(name_list)
print(name)

執行結果:

[{'id': 597, 'name': '巴彥淖爾', 'parentId': 534, 'code': '070400000', 'isSelected': False}]
['巴彥淖爾']

4、獲取以字母C為開頭的前兩個城市

import json
import jsonpath
# 讀取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
# C[0,1,2] 和 C[:3]作用相同,都是獲得前三個數據
name_list = jsonpath.jsonpath(city_json,'$..C[0,1,2]')
name_list1 = jsonpath.jsonpath(city_json,'$..C[:3]')
name = jsonpath.jsonpath(city_json,'$..C[0,1,2].name')
name1 = jsonpath.jsonpath(city_json,'$..C[:3].name')
print(name_list)
print(name_list1)
print(name)
print(name1)

執行結果:

[{'id': 801, 'name': '成都', 'parentId': 552, 'code': '230100000', 'isSelected': False}, {'id': 8, 'name': '重慶', 'parentId': 4, 'code': '040100000', 'isSelected': False}, {'id': 749, 'name': '長沙', 'parentId': 547, 'code': '190100000', 'isSelected': False}]
[{'id': 801, 'name': '成都', 'parentId': 552, 'code': '230100000', 'isSelected': False}, {'id': 8, 'name': '重慶', 'parentId': 4, 'code': '040100000', 'isSelected': False}, {'id': 749, 'name': '長沙', 'parentId': 547, 'code': '190100000', 'isSelected': False}]
['成都', '重慶', '長沙']
['成都', '重慶', '長沙']

5、獲取以字母G為開頭且包含provincialCapital的城市

import json
import jsonpath
# 讀取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
city = jsonpath.jsonpath(city_json,'$..G[?(@.provincialCapital)]')
print(city)

執行結果:

[{'id': 763, 'name': '廣州', 'parentId': 548, 'code': '200100000', 'isSelected': False, 'provincialCapital': True}]

6、獲取以字母C為開頭且price大於13000的城市

import json
import jsonpath
# 讀取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
city = jsonpath.jsonpath(city_json,'$..C[?(@.price>13000).name]')
print(city)

執行結果:

[{'id': 801, 'name': '成都', 'parentId': 552, 'code': '230100000', 'isSelected': False, 'provincialCapital': True, 'price': 15000},
{'id': 8, 'name': '重慶', 'parentId': 4, 'code': '040100000', 'isSelected': False, 'price': 17000}, {'id': 749, 'name': '長沙', 'parentId': 547, 'code': '190100000', 'isSelected': False, 'price': 16000}]

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved