psv-fuyang

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()
        ----------------------------------------------------------------------------------------------------------------------------
        

 

分类:

技术点:

相关文章:

  • 2022-01-21
  • 2021-12-09
  • 2021-11-29
  • 2021-12-09
  • 2021-11-22
  • 2021-12-09
  • 2021-11-22
猜你喜欢
  • 2021-12-09
  • 2021-12-09
  • 2021-11-22
  • 2021-12-09
  • 2021-12-09
  • 2021-11-29
相关资源
相似解决方案