工作需要,刚开始学习java爬虫之类的知识。在看了N多个框架之后决定使用webmagic这个作为项目使用框架。
在学习的过程中,有些解析的内容就是一个json字符串,就百度很多篇关于解析json字符串的方法,需要用到的就是jsonpath类似于xpath。
# JSONPath表达式
JSONPath表达式始终引用JSON结构,其方式与XPath表达式与XML文档结合使用的方式相同。由于JSON结构通常是匿名的,并且不一定具有“根成员对象”,因此JSONPath假定$
分配给外部对象的抽象名称。
JSONPath表达式可以使用 . 表示
$.store.book[0].title
或括号 表示
$['store']['book'][0]['title']
输入路径。内部或输出路径将始终转换为更一般的括号 -注释。
JSONPath允许通配符 *用于成员名称和数组索引。它借用后代从操作者“..” E4X和阵列切片语法提案[start:end:step]
从EcmaScript的4。
底层脚本语言的表达式(<expr>)
可用作显式名称或索引的替代,如
$.store.book[(@.length-1)].title
使用符号'@'表示当前对象。过滤器表达式通过语法支持,?(<boolean expr>)
如
$.store.book[?(@.price < 10)].title
以下是JSONPath语法元素与其XPath对应物的完整概述和并排比较。
XPath | JSONPath | Description |
/ | $ | 从根节点选取。 |
. | @ | 选取当前节点。 |
/ | . or [] | child operator |
.. | n/a | 选取当前节点的父节点。 |
// | .. | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
* | * | 匹配任何元素节点。 |
@ | n/a | 属性访问。JSON结构没有属性。 |
[] | [] | 下标运算符。XPath使用它来迭代元素集合和谓词。在Javascript和JSON中,它是本机数组运算符。 |
| | [,] | XPath中的Union运算符导致节点集的组合。JSONPath允许使用备用名称或数组索引作为集合。 |
n/a | [start:end:step] | 从ES4借来的数组切片运算符。 |
[] | ?() | 应用过滤器(脚本)表达式。 |
n/a | () | 脚本表达式,使用底层脚本引擎。 |
() | n/a | 在Xpath中分组 |
XPath还有很多东西可以提供(位置修补,不是缩写语法,运算符和函数),而不是这里列出的。此外,下标运算符在Xpath和JSONPath中的工作方式存在显着差异。
- XPath表达式中的方括号始终在由前一个路径片段生成的节点集上运行。指数总是从1开始。
- 使用JSONPath方括号对前一个路径片段寻址的对象或数组进行操作。指数总是从0开始。
例子:
{ "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
}
}
}
针对上面的json串做一个xpath与jsonpath的语法比较
XPath | JSONPath | 描述 |
/store/book/author | $.store.book[*].author | 商店里所有书籍的作者 |
//author | $..author | 所有作者 |
/store/* | $.store.* | 商店里的所有东西,都是一些书和一辆红色的自行车。 |
/store//price | $.store..price | 商店里一切的价格。 |
//book[3] | $..book[2] | 第三本书 |
//book[last()] | $..book[(@.length-1)] $..book[-1:] | 最后一本书。 |
//book[position()<3] | $..book[0,1] $..book[:2] | 前两本书 |
//book[isbn] | $..book[?(@.isbn)] | 用isbn number过滤所有书籍 |
//book[price<10] | $..book[?(@.price<10)] | 过滤所有便宜10以上的书籍 |
//* | $..* | XML文档中的所有元素。JSON结构的所有成员。 |
原文内容:http://goessner.net/articles/JsonPath/