数据提取之JSON与JsonPATH

news2024/10/5 2:58:06

第一章 json

一、json简介

json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构

> 1. 对象:对象在js中表示为`{ }`括起来的内容,数据结构为 `{ key:value, key:value, ... }`的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是数字、字符串、数组、对象这几种。

> 2. 数组:数组在js中是中括号`[ ]`括起来的内容,数据结构为 `["Python", "javascript", "C++", ...]`,取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

二、json用法

导包

 import json

json模块提供了四个功能:`dumps`、`dump`、`loads`、`load`,用于字符串 和 python数据类型间进行转换。

1.json.loads()

作用:把json格式的字符串转为Python数据类型

示例代码:

import json

#json格式的字符串
strList = '[1, 2, 3, 4]'
strDict = '{"city": "北京", "name": "大猫"}'

list=json.loads(strList)
print(list)
print(type(list))
# [1, 2, 3, 4]
dict=json.loads(strDict)
print(dict)# json数据自动按Unicode存储
print(type(dict))

e966e38eac394dcbaabd839a066fc116.png

2.json.load()

作用:将json文件读取,并转为python类型

pingping.json

c605f53cc14242c592a4fb5dbce83116.png

示例代码

import json

with open('./pingping.json', 'r') as f:
    data = json.load(f)

print(data)
print(data["name"])  # 输出: pingping
print(data["age"])   # 输出: 23
print(data["is_active"])  # 输出: True

0ec126960de94596999472c074a6fb37.png

3.json.dumps()

作用:把 python 类型 转为 json 类型

示例代码:

import json

# json.dumps()之前
item = {'name':'QQ','app_id':1}
print('before dumps',type(item)) # dict
# json.dumps之后
item = json.dumps(item)
print('after dumps',type(item)) # str

7e69803aff214b21a6fc3a44115727e2.png

4.json.dump()

作用:把python数据类型转为 json格式的字符串

注意:一般让你把抓取的数据保存为json文件时使用

示例代码:

import json

item_list = []
for i in range(3):
    item = {'name': 'QQ', 'id': i}
    item_list.append(item)

with open('xiaomi.json', 'a') as f:
    json.dump(item_list, f, ensure_ascii=False)

15fcedaa74a5437d9ac50a9dceed2b4d.png

5.json模块总结

爬虫最常用

        1、数据抓取 - json.loads(html)

             将响应内容由: json 转为 python

        2、数据保存 - json.dump(item_list,f,ensure_ascii=False)

             将抓取的数据保存到本地 json文件

抓取数据一般处理方式

        1、txt文件

        2、csv文件

        3、json文件

        4、MySQL数据库

        5、MongoDB数据库

        6、Redis数据库

第二章 jsonpath

一、jsonpath简介

JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。

JsonPath 对于 JSON 来说,相当于 XPATH 对于 XML。

> 下载地址:[https://pypi.python.org/pypi/jsonpath](https://pypi.python.org/pypi/jsonpath/)

> > 安装方法:点击`Download URL`链接下载jsonpath,解压之后执行`python setup.py install`

                        或者终端命令中输入pip install josnpath

> > 官方文档:[http://goessner.net/articles/JsonPath](http://goessner.net/articles/JsonPath/)

二、jsonpath的使用

1. jsonpath 函数参数

我们在使用jsonpathd的时候一般是使用它里面的jsonpath函数,即jsonpath.jsonpath()。

jsonpath()接受5个参数,如下

jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True)

obj:要搜索的 JSON 对象。

expr:JSONPath 表达式,用于指定要提取的值的路径。

result_type:可选参数,用于指定返回结果的类型。默认为 ‘VALUE’,表示返回匹配到的值;还可以选择 ‘PATH’,表示返回匹配到的路径;或者选择 ‘BOTH’,表示同时返回匹配到的值和路径。

debug:可选参数,用于控制调试模式。默认为 0,表示关闭调试模式;设置为 1,则会在控制台输出调试信息。

use_eval:可选参数,用于指定是否使用 eval() 函数来计算表达式。默认为 True,表示使用 eval();设置为 False,则会使用更安全的方式来计算表达式。

其中obj 和 expr 是必须参数,即要处理的json数据对象和提取表达式,常用的就是这两个参数,其他参数可以根据个人需要赋值。

2.jsonpath 匹配规则

jsonpath
$从根节点开始匹配
@从当前节点开始匹配
. or [ ]取子节点
. .就是不管位置,选择所有符合条件的条件(递归匹配)
*匹配所有节点
[ ]迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
[ , ]支持迭代器中做多选
?()支持过滤操作
( )支持表达式

如:

表达式描述

$

根对象

$.store

根对象下的 store 属性

$.store.book

store 对象下的 book 属性

$.store.book[*]

book 数组中的所有元素

$.store.book[0]

book 数组中索引为 0 的元素

$.store.book[*].author

book 数组中每个元素的 author 属性

$..author

所有嵌套的 author 属性

$.store.*

store 对象中的所有属性

$..*

所有嵌套的属性

$.store.book[?(@.isbn)]

book 数组中所有有 isbn 属性的元素

$.store.book[?(@.price < 10)]

book 数组中所有价格小于 10 的元素

$.store.book[?(@.price <= 10 && @.category == 'fiction')]

book 数组中所有价格小于等于 10 且类别为小说的元素

$.store.book[?(@.price * 0.9 < 10)]

book 数组中所有打折后价格小于 10 的元素

$.store.book[0:3]

book 数组中索引从 0 到 2 的元素

$.store.book[:2]

book 数组中索引从 0 到 1 的元素

$.store.book[1:]

book 数组中索引从 1 到最后的元素

$.store.book[-1]

book 数组中的最后一个元素

$.store.book[1:2:1]

book 数组中索引从 1 到 1 的元素,步长为 1

$.store.book.length()

book 数组的长度

$..book[?(@.price < 10)].title

所有嵌套的 book 数组中价格小于 10 的元素的 title 属性

$..[?(@.isbn)]

所有有 isbn 属性的嵌套元素

$..[?(@.price < 10)]

所有价格小于 10 的嵌套元素

$..[?(@.price <= 10 && @.category == 'fiction')]

所有价格小于等于 10 且类别为小说的嵌套元素

$..[?(@.price * 0.9 < 10)]

所有打折后价格小于 10 的嵌套元素

$..[?(@.price < 10)].author

所有价格小于 10 的嵌套元素的 author 属性

$..[?(@.price < 10)].title

所有价格小于 10 的嵌套元素的 title 属性

示例代码:

from jsonpath import jsonpath
data = { "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
    }
  }
}
authors=jsonpath(data,'$..author')
titles=jsonpath(data,'$.store.book[*].title')
items=jsonpath(data,'$.store.*')
print(authors)
print(titles)
print(items)

bc4bdbab74e24b3f8056f7d4fdf37235.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2189135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新版本SkyWalking【10.1.0】部署

这里写目录标题 前言前置条件启动Skywalking下载解压启动说明 集成Skywalking Agent下载Agent在IDEA中添加agent启动应用并访问SpringBoot接口 说明 前言 基于当前最新版10.1.0搭建skywalking 前置条件 装有JDK11版本的环境了解SpringBoot相关知识 启动Skywalking 下载 地…

浑元换算策略和武德换算策略-《分析模式》漫谈36

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第3章有这么一句&#xff1a; A conversion, however deterministic, does not follow that faithfully. 2004&#xff08;机械工业出版社&#xff09;中译本…

HTB:Explosion[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What does the 3-letter acronym RDP stand for? 2.What is a 3-letter acronym that refers to interaction with the host through a command line interface? 3.What about graphical user interface interactions? 4.What is the…

【MySQL 08】复合查询

目录 1.准备工作 2.多表查询 笛卡尔积 多表查询案例 3. 自连接 4.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 1.union 2.union all 1.准备工作 如下三个表&#xff0c;将作为示例&#xff0c;理解复合查询 EMP员工表…

深入探究:在双链表的前面进行插入操作的顺序

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;惟有主动付出&#xff0c;才有丰富的果…

一次解决Go编译问题的经过

用Go语言编写了一个小的项目&#xff0c;项目开发环境是在本地的Windows环境中&#xff0c;一切单元测试和集成测试通过后&#xff0c;计划将项目部署到VPS服务器上自动运行&#xff0c;但在服务器上执行go run运行时&#xff0c;程序没有任何响应和回显&#xff0c;甚至main函…

有没有一款软件,可以在二楼电脑直接唤醒三楼的电脑?

前言 今天有个小姐姐找到我&#xff0c;咨询能不能在二楼的电脑直接访问到三楼电脑的资料。 这个肯定是可以的啊&#xff01; 其实事情很简单&#xff0c;只需要弄好共享文件夹这个功能&#xff0c;只要手机、平板或者电脑在同个局域网下&#xff0c;就能访问到三楼电脑里的…

深入理解Dubbo源码核心原理-Part4

现在开始研究&#xff0c;消费端真正调用proxy的方法时&#xff0c;走的rpc调用 接下来就要走client&#xff0c;发送request请求了 Dubbo协议是怎样的呢&#xff1f; 具体每个字段什么含义请参照官网 链接&#xff1a;Dubbo协议头含义 编码器按照Dubbo协议来进行编码请求 Ne…

JVM内存回收机制

目录 1.JVM运行时数据区 2.JVM类加载过程 3.双清委派模型 4.垃圾回收机制&#xff08;GC&#xff09; 找出谁是垃圾方案一&#xff1a;引用计数 找出谁是垃圾&#xff1a;方案二&#xff0c;可达性分析 释放垃圾的内存空间 判断垃圾&#xff1a;jvm依据对象的年龄对 对象…

基于Zynq SDIO WiFi移植三(支持2.4/5G)

应用问题-WIFI作为AP-hostapd多次连接 设备作为WIFI热点时&#xff0c;连接出现了下述问题&#xff1a; 1 手机连接需要三次&#xff0c;三次都需要输入密码&#xff1b; 2 平板连接需要三次&#xff0c;三次都需要输入密码&#xff1b; 3 电脑连接需要一次&#xff0c;无感…

隧道人员定位UWB双通道定位终端

大家好&#xff0c;我是华星智控小智&#xff0c;今天我给大家介绍我们的UWB双通道定位终端。 双通道定位终端&#xff08;型号STD&#xff09;主要用于隧道人员或天车定位&#xff0c;终端基于无线脉冲技术&#xff0c;采用双天线设计&#xff0c;可实现对2路方向的测距定位&a…

实施威胁暴露管理、降低网络风险暴露的最佳实践

随着传统漏洞管理的发展&#xff0c;TEM 解决了因攻击面扩大和安全工具分散而产生的巨大风险。 主动式 TEM 方法优先考虑风险并与现有安全工具无缝集成&#xff0c;使组织能够在威胁被有效利用之前缓解威胁。 为什么威胁暴露管理 (TEM) 在现代网络安全策略中变得至关重要&…

使用模拟和真实的 Elasticsearch 来测试你的 Java 代码

作者&#xff1a;来自 Elastic Piotr Przybyl 在本文中&#xff0c;我们将介绍并解释两种使用 Elasticsearch 作为外部系统依赖项来测试软件的方法。我们将介绍使用模拟测试和集成测试的测试&#xff0c;展示它们之间的一些实际差异&#xff0c;并给出一些关于每种风格的提示。…

嵌入式C语言自我修养:编译链接

源文件生成可执行文件的过程&#xff1f; 源文件经过预处理、编译、汇编、链接生成一个可执行的目标文件。 编译器驱动程序&#xff0c;包括预处理器、编译器、汇编器和链接器。Linux用户可以调用GCC驱动程序来完成整个编译流程。 使用GCC驱动程序将示例程序从ASCII码源文件转换…

如何使用EventChannel

文章目录 1 知识回顾2 示例代码3 经验总结我们在上一章回中介绍了MethodChannel的使用方法,本章回中将介绍EventChannel的使用方法.闲话休提,让我们一起Talk Flutter吧。 1 知识回顾 我们在前面章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种…

仿RabbitMQ实现消息队列服务端(一)

文章目录 交换机数据管理队列数据管理绑定信息(交换机-队列)管理队列消息管理虚拟机管理交换机路由管理队列消费者/订阅者管理 整体框架&#xff1a;工具模块及项目整体模块框架 交换机数据管理 交换机数据管理就是描述了交换机应该有哪些数据 定义交换机数据类 1、交换机的名…

Linux忘记root用户密码怎么重设密码

直接说步骤&#xff1a; 1.重启客户机 2.在选择内核页面快速按e键&#xff0c;进入编辑模式 进入后应该是这个样子 在这里只能按上下键切换行 找到Linux16这里 3.按右方向键切换到行尾&#xff0c;也就是UTF-8处&#xff0c;在后面添加一个空格&#xff0c;然后加上这段话 …

鸿蒙网络管理模块04——网络连接管理

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 网络连接管理提供管理网络一些基础能力&#xff0c;包括WiFi/蜂窝/Etherne…

数据库概述(1)

课程主页&#xff1a;Guoliang Li Tsinghua 数据库在计算机系统中的位置 首先&#xff0c;数据库是在设计有大量数据存储需求的软件时必不可少可的基础。 最常见的是&#xff1a;我们通过app或者是浏览器来实现一些特定需求——比如转账、订车票。即引出背后的CS和BS两种网…

如何用深度神经网络预测潜在消费者

1. 模型架构 本项目采用的是DeepFM模型&#xff0c;其结构结合了FM&#xff08;因子分解机&#xff09;与深度神经网络&#xff08;DNN&#xff09;&#xff0c;实现了低阶与高阶特征交互的有效建模。模型分为以下几层&#xff1a; 1.1 FM部分&#xff08;因子分解机层&#…