python中数据提取方法(3)----jsonpath

237 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

1.什么是jsonpath?

之前的文章里面提到xpath是用于提取HTML\XML类型的数据,jsonpath则是用于提取json格式的数据

2.jsonpath的安装与使用

jsonpath的详细文档:goessner.net/articles/Js…

安装命令:pip install jsonpath

3.jsonpath的语法

$ : 根节点

@ : 现行节点

.or[] :取子节点

n/a : 取父节点,Jsonpath未支持

.. : 就是不管位置,选择所有符合条件的条件

星号* :匹配所有元素节点

n/a :根据属性访问,Json不支持,因为Json是个Kev-value递归结构,不需要属性

[] : 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)

[,] : 支持迭代器中做多选。

?() : 支持过滤操作.

() : 支持表达式计算

n/a :分组,JsonPath不支持

4.举例

    "book": [ 
      { "category": "r",
        "author": "N",
        "title": "S",
        "price": 8,
        "time":"2011"
      },
      { "category": "f",
        "author": "E",
        "title": "S",
        "price": 22,
        "time":"2001"
      },
      { "category": "f",
        "author": "H",
        "title": "M",
        "isbn": "3",
        "price": 33,
        "time":"2011"
      },
    ],
    "bicycle": {
      "color": "white",
      "price": 5,
      "time":"2013"
    }
    "music":{
      "name":"vc",
      "time":"1998",
      "author":"jon"
    }
  }
}

$.store.book[*].author :store中的所有的book的作者

$..author :所有的作者

$..time :所有的发行时间

$.store.* :store下的所有的元素

$.store..price :store中的所有的内容的价格

$..book[2] :第三本书

..book[(@.length1)]..book[(@.length-1)] | ..book[-1:] :最后一本书

..book[θ,1]..book[θ,1] | ..book[:2] :前两本书

$..book[?(@.isbn)] : 获取有isbn的所有数

$..book[?(@.price<10)] :获取价格大于10的所有的书

$..* : 获取所有驱数据

再举个例子:

{"clusters": {
  "cpvFeatureData": {
    "checkedNum": "0",
    "clkValue": "clk_page=keyword;leaf_cateid=134;cpv_clk_id=",
    "exposureValue": "imps_page=keyword;leaf_cateid=134;cpv_imps_id=6500007641,6500008313,6500008274,6500007620,",
    "title": {
      "name": "SUGGESTED FILTERS"
    },
    "type": "SUGGESTED FILTERS",
    "values": [
      {
        "back": false,
        "checked": false,
        "href": "//www.alibaba.com/trade/search?fsb=y&IndexArea=product_en&categoryId=134&clusterId=6500007641&keywords=Agricultural+Machinery+Parts&viewtype=L&",
        "id": "6500007641",
        "image": "//sc01.alicdn.com/kf/HTB1DFGFrQCWBuNjy0Faq6xUlXXaZ.jpg_100x100.jpg",
        "name": "Oil Pump",
        "noXpjax": false
      },
      {
        "back": false,
        "checked": false,
        "href": "//www.alibaba.com/trade/search?fsb=y&IndexArea=product_en&categoryId=134&clusterId=6500008313&keywords=Agricultural+Machinery+Parts&viewtype=L&",
        "id": "6500008313",
        "image": "//sc01.alicdn.com/kf/HTB1XkzKKf5TBuNjSspmq6yDRVXaK.jpg_100x100.jpg",
        "name": "Piston",
        "noXpjax": false
      },
      {
        "back": false,
        "checked": false,
        "href": "//www.alibaba.com/trade/search?fsb=y&IndexArea=product_en&categoryId=134&clusterId=6500008274&keywords=Agricultural+Machinery+Parts&viewtype=L&",
        "id": "6500008274",
        "image": "//sc01.alicdn.com/kf/HTB1CbGiRXXXXXbAaFXX760XFXXXB.png_100x100.jpg",
        "name": "Gear",
        "noXpjax": false
      },
      {
        "back": false,
        "checked": false,
        "href": "//www.alibaba.com/trade/search?fsb=y&IndexArea=product_en&categoryId=134&clusterId=6500007620&keywords=Agricultural+Machinery+Parts&viewtype=L&",
        "id": "6500007620",
        "image": "//icbu-cpv-image.oss-us-west-1.aliyuncs.com/Laidong-4L22BT-Water-Pump-4L22BT-Diesel-Engine.jpg_100x100.jpg",
        "name": "Water Pump",
        "noXpjax": false
      }
}

可以拿着个练练手:

取出所有的名字:$..name

取出value列表中的第三个字典的id: ?

欢迎在评论区分享你的答案

5.使用jsonpath的注意点

(1)jsonpath的导入使用,导入命令:from jsonpath import jsonpath,我们需要使用的是jsonpath这个库中的jsonpath这个类中的方法,所以不能直接导入jsonpath

(2)jsonpath是对json类型的数据进行提取,有些数据看起来是json类型的但实际可能是str类型的,所以使用jsonpath对数据进行提取时首先看一下数据类型,如果不是json格式的要先转换成json格式的然后再使用jsonpath进行数据提取。

以上就是jsonpath的数据提取的知识点了,有人会私信我说语法有点多记不住怎么办,勤加练习就好了,用的多了自然就记住了。