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
['李白', '杜甫', '白居易', '陶渊明']
['杜甫']
posted @ 2023-06-28 22:54  枫_Null  阅读(11)  评论(0)    收藏  举报