Python爬虫 #005 jsonpath
点击查看代码
# 数据
data = '''{"store": {
"book": [
{
"category": "reference",
"author": "李白",
"title": "《将进酒》",
"price": 9.5
},
{
"category": "fiction",
"author": "杜甫",
"title": "《登高》",
"price": 8.8,
"date":"1998.08"
},
{
"category": "fiction",
"author": "白居易",
"title": "《琵琶行》",
"price": 16
},
{
"category": "reference",
"author": "陶渊明",
"title": "《归园田居》",
"price": 11
}
]
}
}
'''
5.1-转化为json数据
import json
import jsonpath
# 转化为一个json格式的对象
json_obj = json.loads(data, encoding = 'utf-8')
print(json_obj)
{'store': {'book': [{'category': 'reference', 'author': '李白', 'title': '《将进酒》', 'price': 9.5}, {'category': 'fiction', 'author': '杜甫', 'title': '《登高》', 'price': 8.8, 'date': '1998.08'}, {'category': 'fiction', 'author': '白居易', 'title': '《琵琶行》', 'price': 16}, {'category': 'reference', 'author': '陶渊明', 'title': '《归园田居》', 'price': 11}]}}
5.2-根据节点查标签
方法一:严格根据节点
## $. 为当前节点, *表示所有
result1 = jsonpath.jsonpath(json_obj,'$.store.book[*].author')
print(result1)
## 子节点可以用 . 表示也可以用 [] 表示
result2 = jsonpath.jsonpath(json_obj,'$.store.book[*][author]')
print(result2)
### jsonpath 索引从0开始,而xpath从1开始
result3 = jsonpath.jsonpath(json_obj,'$.store.book[1].author')
print(result3)
>>>: ['李白', '杜甫', '白居易', '陶渊明']
>>>: ['李白', '杜甫', '白居易', '陶渊明']
>>>: ['杜甫']
方法二:不严格根据节点
# 查多个元素或属性
## $.. 为所有,相当于xpath中 // 注意[]内不用引号
result1 = jsonpath.jsonpath(json_obj,'$..[author,title]')
print(result1)
['李白', '《将进酒》', '杜甫', '《登高》', '白居易', '《琵琶行》', '陶渊明', '《归园田居》']
5.3-根据条件找标签
# ? 查询是否有 date (除了这本,其他书没有date,注意看)
result1 = jsonpath.jsonpath(json_obj,'$.store.book[?(@.date)]')
print(result1)
# book 为列表 -1表示取倒数第一个数
result2 = jsonpath.jsonpath(json_obj,'$.store.book[(@.length -1)]')
print(result2)
# 注意:price标签下的数值必须是int类型的数据
result3 = jsonpath.jsonpath(json_obj,'$.store.book[?(@.price>15)]')
print(result3)
[{'category': 'fiction', 'author': '杜甫', 'title': '《登高》', 'price': 8.8, 'date': '1998.08'}]
[{'category': 'reference', 'author': '陶渊明', 'title': '《归园田居》', 'price': 11}]
[{'category': 'fiction', 'author': '白居易', 'title': '《琵琶行》', 'price': 16}]
5.4-常见疑惑
# book 有四本,没指明获取那一本的 author,则false
result1 = jsonpath.jsonpath(json_obj,'$.store.book.author')
print(result1)
# [] 相当于 . 可理解为$.store.book..author, .. 为所有
result2 = jsonpath.jsonpath(json_obj,'$.store.book.[author]')
print(result2)
# 这里为什么没有获得所有,因为 book[1] 限制了只在这本书
result3 = jsonpath.jsonpath(json_obj,'$.store.book[1].[author]')
print(result3)
False
['李白', '杜甫', '白居易', '陶渊明']
['杜甫']
本文来自博客园,作者:{枫_Null},转载请注明原文链接:https://www.cnblogs.com/fengNull/articles/15488757.html

浙公网安备 33010602011771号