jsonpath

JSONPATH

   我们在抓取的时候,可以访问一些网页的api接口,网站通过接口返回给我们的是json数据,这样就省去了我们用xpath取解析的麻烦,然而有时候这个接送数据量特别大,如汽车数据,每个汽车有两百多个信息,一下子给你返回十几辆车的信息,这个json数据量就比较大了,这个时候想要提取出有用的信息就需要一大堆的for循环, 不停的字典.get() 方法获取数据,比较麻烦,代码也不美观.这个时候我们就可以用jsonpath解决问题.

  1. 先来熟悉一下jsonpath的操作符

  • $   查询根元素
  • @  当前节点由过滤词处理
  • *    通配符, 必要时可用任何地方的名称或数字
  • ..   深层扫描
  • .<name>  表示子节点
  • ['<name>', (,'<name>')]   括号表示子项
  • [start:end]  数组切片操作
  • [?( expresion )]   过滤表达式, 表达式必须为一个布尔值

  2. jsonpath的函数

  • min()    数字数组的最小值
  • max()    数字数组的最大值
  • avg()     数字数组的平均值
  • stddev()   数字数组的标准差值
  • length()    数组的长度 

  以上函数只有length函数返回整形, 其他方法返回的都是浮点型

  3. 过滤器运算符

   过滤器是用于筛选数组的逻辑表达式,一个典型的过滤器格式如下:[?(@.age > 18)], 其中@表示当前正在处理的项目.  

   可以使用逻辑运算符&&和||创建更复杂的项目,

   字符串文字必须用单引号或者双引号括起来 如: [?(@.color == 'blue' )] 或者 [?(@.color == "blue")]

  • ==     等于
  • !=      不等于
  • <=
  • >
  • >=
  • =~   匹配正则表达式    [?(@.name =~ /foo.*?/i)]
  • in    左边存在于右边    [?(@.name in ['s', 'm'])] 
  • nin  左边不存在于右边
  • size   数组或字符串长度
  • empty  数组或字符串为空

  4 实例

{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}
                        

在线测验网址: http://jsonpath.herokuapp.com/

  • 获取json中store下面的book下面的所有作者     $.store.book[*].author
  • 获取json中的所有作者    $..author
  • 匹配store中所有的物品    $.store.*
  • 获取json中的所有price值    $..price
  • 获取book数组中的第三个值   $.store.book[2]
  • 倒数的第二本书     $.store.book[-2]
  • 前两本书    $.store.book[0, 1]
  • 索引0到索引2的所有书   $.store.book[0:2]
  • 最后两本书        $.store.book[-2:]
  • 包含isbn属性的所有书   $.store.book[?(@.isbn)]
  • price小于10的所有书    $.store.book[?(@.price< 10)]
  • 获取json中book数组中price<=expensive的所有值        $..book[?(@.price <= $['expensive'])]
  • 获取json中book数组中的作者以REES结尾的所有值(REES不区分大小写)  $..book[?(@.author =~ /.*REES/i)]
  • 逐层列出json中的所有值,层级由外到内  $..*
  • 获取json中book数组的长度    $..book.length()

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/zhangjian0092/p/12144589.html