学科分类
目录
网络爬虫

JSONPath与Xpath语法对比

JSON结构清晰,可读性高,复杂度低,非常容易匹配。JSONPath的语法与Xpath类似,表1中列举了JSONPath对应XPath的用法。

表1 JSONPath与XPath语法对比

XPath JSONPath 描述
/ $ 根节点
. @ 现行节点
/ .or[] 取子节点
.. n/a 取父节点,JSONPath未支持
// .. 就是不管位置,选择所有符合条件的节点
* * 匹配所有元素节点
@ n/a 根据属性访问,JSON不支持,因为JSON是个key-value递归结构,不需要属性访问。
[] [] 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
| [,] 支持迭代器中做多选。
[] ?() 支持过滤操作.
n/a () 支持表达式计算
() n/a 分组,JSONPath不支持

接下来使用一个JSON文档来演示JSONPath的具体使用。JSON文档的内容如下:

{
  "store": {
   "book": [
    { "category": "reference",
     "author": "Nigel Rees",
     "title": "Sayings of the Century",
     "price": 8.95
    },
    { "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
   }
  }
 }

假设变量bookJson里已经包含了这段JSON字符串,那么可通过以下代码反序列化得到JSON对象:

books = json.loads(bookJson)

(1)查看store下的bicycle的color属性:

checkurl = "$.store.bicycle.color"
print(jsonpath.jsonpath(books, checkurl))
# 输出:['red']

(2)输出books列表中包含的所有对象

checkurl = "$.store.book[*]"
object_list = jsonpath.jsonpath(books, checkurl)
print(object_list)

(3)输出books列表的第一个对象

checkurl = "$.store.book[0]"
obj = jsonpath.jsonpath(books, checkurl)
print(obj)
# 输出:[{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}]

(4)输出books列表中所有对象对应的属性title值

checkurl = "$.store.book[*].title"
titles = jsonpath.jsonpath(books, checkurl)
print(titles)
# 输出:['Sayings of the Century', 'The Lord of the Rings']

(5)输出books列表中category为fiction的所有对象

checkurl = "$.store.book[?(@.category=='fiction')]"
books = jsonpath.jsonpath(books, checkurl)
print(books)
# 输出:[{'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]

(6)输出books列表中所有价格小于10的对象

checkurl = "$.store.book[?(@.price<10)]"
books = jsonpath.jsonpath(books, checkurl)
print(books)
# 输出:[{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}]

(7)输出books列表中所有含有isbn的对象

checkurl = "$.store.book[?(@.isb)]"
books = jsonpath.jsonpath(books, checkurl)
print(books)
# 输出:[{'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]
点击此处
隐藏目录