JsonPath与json模块
============================================================
Json & JsonPath
============================================================
看门见山:使用JsonPath步骤
---------------------------------------------------------------------------------------------------------------------------------
| wget https://pypi.python.org/pypi/jsonpath/ 第一步:下载并源码安装JsonPath
|
| import jsonpath 第二步:引入jsonpath
|
| html_object = Json.loads(html) 第三步:使用Json.loads()方法将下载的json格式的网页字符串转化为python对象
|
| result_object = jsonpath.jsonpath(html_object,\'xxx jsonpath匹配语法\') 第四步:使用jsonpath语法从python对象中获取需要的信息对象,返回的是列表[]
|
| result_string = Json.dumps(result_object,encoding=\'utf-8\') 第五步:使用Json.dumps()方法将获取到的目标信息对象转化为json字符串(用于后续存储等操作)
|
---------------------------------------------------------------------------------------------------------------------------------
准备:认识Json
json的形式
---------------------------------------------------------------------------------------------------------------------------------
| Json(JavaScript Object Notation)是一种轻量级的数据交换格式, 更简单说就是javascript中的对象和数组,即Json有两种数据结构:
|
|
| json结构1: { key1:val1 , key2:val2 , key3:val3 , ... } 字段的value类型可以是:数字/字符/数组/对象/
| ---------------------------------------------------------------------------------------------------
| 此种json结构形如javascript中的对象{...}
| 使用 (对象.key) 方法获取属性的值
|
| json结构2: [ val1 , val2 , val2 , ... ] 字段类型可以是:数字/字符/数组 (没有对象)
| -----------------------------------------------------------------------------------------------
| 此种json结构形如javascript中的数组[...]
| 使用 (索引下标) 方法获取字段的值
|
----------------------------------------------------------------------------------------------------------------------------------
json模块
---------------------------------------------------------------------------------------------------------------------------------
| python中的json模块提供四个功能:dumps/dump/loads/load 用于在json字符串和python对象之间进行格式转换
|
|
| json.dumps() --- 把python类型的对象序列化为json格式的字符串
| ---------------------------------------------------------------------------------------------------
| import json
|
| list_py_obj = [1,2,3,4] ---> python列表类型的对象: [1,2,3,4]
| list_js_str = json.dumps( list_py_obj ) ---> json类型的字符串: \'[1,2,3,4]\'
|
| tuple_py_obj = (1,2,3,4) ---> python元组类型的对象: (1,2,3,4)
| tuple_js_str = json.dumps( tuple_js_obj ) ---> json类型的字符串: \'(1,2,3,4)\'
|
| dict_py_obj = {\'city\':\'北京\',\'name\':\'大猫\'} ---> python字典类型的对象: {\'city\':\'北京\',\'name\':\'大猫\'}
| dict_js_str = json.dumps( dict_py_obj ) ---> json类型的字符串: \'{"city": "\\u5317\\u4eac", "name": "\\u5927\\u5218"}\'
| 说明:json进行序列话的时候默认采用ascii编码,所以要打印上述字串会出错
|
| dic_js_str = json.dumps( dict_py_obj,ensure_ascii=False ) --->json类型的字符串:\'{\'city\':\'北京\',\'name\':\'大猫\'}\' #禁用ascii,采用utf-8编码
| 说明:使用ensure_ascii=False参数禁用ascii编码后,会默认采用utf-8编码,所以打印上述字串就正常了
|
| json.dump() --- 把python类型的对象序列化为json格式的字符串,并写入文件保存
| ---------------------------------------------------------------------------------------------------
| import json
|
| list_py_obj = [{\'city\':\'北京\'},{\'name\':\'大猫\'}]
| json.dump( list_py_obj , open(\'list.json\',\'w\') , ensure_ascii=False ) ---> 将Python列表类型的对象进行dump序列化为json字符串,并存储到list.json文件中
|
| dict_py_obj = {\'city\':\'北京\',\'name\':\'大猫\'}
| json.dump( dict_py_obj , open(\'dict.json\',\'w\') , ensure_ascii=False ) ---> 将Python字典类型的对象进行dump序列化为json字符串,并存储到dict.json文件中
|
|
| json.loads() --- 把json格式的字符串反序列化为python类型的对象
| ---------------------------------------------------------------------------------------------------
| import json
|
| list_js_str = \'[1,2,3,4]\' ---> json格式的字符串: \'[1,2,3,4]\'
| list_py_obj = json.loads( list_js_obj ) ---> python列表类型的对象: [1,2,3,4]
|
| dict_js_str = "{\'city\':\'北京\',\'name\':\'大猫\'}" ---> json格式的字符串: "{\'city\':\'北京\',\'name\':\'大猫\'}"
| dict_py_obj = json.loads( dict_py_obj ) ---> python字典类型的对象: {\'city\':\'北京\',\'name\':\'大猫\'}
|
|
| json.load() --- 从文件中读取json格式的字符串,并将其反序列化为python类型的对象
| ---------------------------------------------------------------------------------------------------
| import json
|
| list_py_obj = json.load( open(list.json) ) ---> 读取本地list.json文件的内容(json格式字符串)并反序列化为python的列表对象: [1,2,3,4]
|
| dict_py_obj = json.load( open(dict.json) ) ---> 读取本地dict.json文件的内容(json格式字符串)并反序列化为python的字典对象: {\'city\':\'北京\',\'name\':\'大猫\'}
|
|
| 附录1:json与python类型转换对照表
| |-----------------------------------------|----------------------------------------------------------
| | python <--------------> json
| |
| -----------------------------------------|
| | dic <-----------------> object
| | list/tuple <----------> arry
| | str/unicode <---------> string
| | int/long/float <------> number
| | True <----------------> true
| | False <---------------> false
| | None <----------------> null
| |
| -----------------------------------------|
|
| 附录2: json模块使用时的编码格式转换(见资料)
| ---------------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------------------------------------------
JsonPath
----------------------------------------------------------------------------------------------------------------------------------
| JsonPath是一种抽取信息的类库,用于从json文档中抽取指定的信息
|
| JsonPath对于Json,相当于XPath对于XML
|
| JsonPath与XPath语法比较
| --------------------------------------------------------------------------
| $ 根节点
| * 匹配所有元素节点
| @ 当前节点 ---X---> "@"在xpath中是:根据属性访问
| .或[] 子节点 ---X---> "."在xpath中是:当前节点
| .. 无论什么位置,选择所有符合条件的节点 ---X---> ".."在xpath中是:父节点
| [] 迭代器标本
| [,] 支持迭代器中做多选
| ?() 支持过滤操作
| () 支持表达式计算 ---X---> "()"在xpath中是:分组
| ---------------------------------------------------------------------------------
|
| 注意:xpath匹配返回的
|
----------------------------------------------------------------------------------------------------------------------------------
JsonPath爬虫案例: 获取拉勾网Json文件中所有城市名
----------------------------------------------------------------------------------------------------------------------------
| #!/usr/bin/env python
| #coding:utf-8
|
| import urllib2
| import jsonpath
| import json
| import chardet
|
| url = "http://www.lagou.com/lbs/getAllCitySearchLabels.json"
| headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"}
| request = urllib2.Request(url,headers=headers)
| response = urllib2.urlopen(request)
| html = response.read()
| html = json.loads(html) #把json字符串转化为python类型对象
| city_list = jsonpath.jsonpath(html,\'$..name\') #从根节点开始,匹配name节点,返回的是列表对象
|
| print city_list
| print type(city_list)
|
| city_string = json.dumps(city_list,encoding="utf-8") ----> \'[ xx, yy, zz, ...]\'
| chardet.detect(city_string)
| f = open(\'city_list.json\',\'w\')
| f.write(city_string)
| f.close()
----------------------------------------------------------------------------------------------------------------------------