python爬虫-------JsonPath(第十九天)

news2025/6/28 19:59:47

🎈🎈作者主页: 喔的嘛呀🎈🎈
🎈🎈所属专栏:python爬虫学习🎈🎈
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 

目录

一、了解JsonPath

二、JsonPath 用法

基本语法

表达式示例

过滤器

过滤器示例

支持的操作符

通配符

三、案列

三、总结


一、了解JsonPath

jsonPath 是一种用于在 JSON 数据中定位和提取信息的查询语言,类似于 XPath。它可以帮助你从复杂的 JSON 结构中提取所需的数据。以下是 JsonPath 的基本用法,包括选择器、过滤器和简单路径:

  1. 选择器:用于选择 JSON 对象的属性或数组元素。例如,$.store.book 选择了 JSON 数据中的 store 对象的 book 属性。
  2. 过滤器:用于根据条件过滤数组元素。过滤器使用 ?() 表达式,并可以包含比较操作符(如 ==!=<><=>=)和逻辑操作符(如 &&||)。例如,$.store.book[?(@.price > 10)] 选择了价格大于 10 的书籍。
  3. 简单路径:路径可以使用**.来访问对象的属性,[*]** 来表示数组中的所有元素,[n] 来表示数组中的第 n 个元素。例如,$.store.book[*].title 选择了所有书的标题。

这些是 JsonPath 的基本概念和用法。可以根据需要深入学习和探索 JsonPath 的更多功能和高级用法,例如递归下降、表达式计算等。

二、JsonPath 用法

JSONPath 是一种用于在 JSON 数据中查询和定位信息的表达式语言,类似于 XPath。它提供了一种灵活而强大的方式来处理 JSON 数据。以下是 JSONPath 表达式的详细全面解释:

基本语法

  • $:根对象。
  • .:属性操作符,用于访问对象的属性。
  • []:下标操作符,用于访问数组元素。

表达式示例

  • $.store.book[0].title:选择根对象中的 store 对象的 book 数组的第一个元素的 title 属性。
  • $.store.*:选择根对象中的 store 对象的所有属性。
  • $.store..price:选择根对象中的 store 对象及其子孙对象中的所有 price 属性。
  • $..book[?(@.price < 10)]:选择所有 book 数组中价格低于 10 的元素。
  • $..*:选择根对象及其所有子孙对象中的所有属性。

过滤器

  • ?():过滤器操作符,用于过滤数组元素。
  • @:当前对象。

过滤器示例

  • $..book[?(@.price < 10)]:选择所有价格低于 10 的书籍。
  • $.store.book[?(@.category == 'fiction' && @.price > 10)].title:选择类别为 fiction 且价格高于 10 的书籍的标题。

支持的操作符

  • ==:等于。
  • !=:不等于。
  • <<=>>=:比较操作符。
  • &&||:逻辑操作符。

通配符

  • ``:匹配所有属性或数组中的所有元素。
  • ..:递归下降,匹配所有子孙对象。

假设我们有以下 JSON 数据表示一个人的信息:

{
    "name": "John Doe",
    "age": 30,
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "zipcode": "12345"
    },
    "children": [
        {
            "name": "Jane",
            "age": 5
        },
        {
            "name": "Alex",
            "age": 8
        }
    ]
}

下面是一些常见的 JSONPath 表达式示例:

  1. 获取姓名:

    $.name
    
  2. 获取地址城市:

    $.address.city
    
  3. 获取所有子女的姓名:

    $.children[*].name
    
  4. 获取年龄大于 6 岁的子女姓名:

    $.children[?(@.age > 6)].name
    
  5. 获取所有信息(包括姓名、年龄、地址等):

    $.*
    
  6. 获取所有子女信息(包括姓名和年龄):

    $.children[*]
    
  7. 获取所有信息中包含字母 'a' 的属性:

    $..*[?(@ =~ /a/)]
    

这些示例展示了 JSONPath 表达式的一些常见用法,包括访问对象属性、数组元素、使用过滤器等。JSONPath 还支持更多功能,如使用通配符、递归下降等,具体取决于需要查询的 JSON 数据结构和查询需求。

三、案列

提取汽车之家的汽车的品牌信息

1、获取JSON 数据结构

import requests
from jsonpath_ng import parse

url = '<https://www.autohome.com.cn/ashx/AjaxIndexCarFind.ashx?type=1&value=&_=1648458024986>'

# 发起请求
response = requests.get(url)
data = response.json()

# 打印整个 JSON 数据
print(data)

2、根据提取的 JSON 数据结构,使用以下代码来提取品牌信息:

import requests
from jsonpath_ng import parse

url = '<https://www.autohome.com.cn/ashx/AjaxIndexCarFind.ashx?type=1&value=&_=1648458024986>'

# 发起请求
response = requests.get(url)
data = response.json()

# 使用 JsonPath 提取品牌信息
brand_expr = parse("$.result.branditems[*]")
brands = [match.value for match in brand_expr.find(data)]

print("汽车品牌信息:")
for brand in brands:
    brand_id = brand["id"]
    brand_name = brand["name"]
    logo_url = brand["logo"]
    country = brand["country"]
    print(f"品牌ID:{brand_id},品牌名称:{brand_name},国家:{country},Logo URL:{logo_url}")

结果展示:

三、总结

在使用Python进行网页抓取时,JsonPath是一个非常强大的工具,可以帮助我们以一种简洁而高效的方式提取和处理JSON格式的数据。通过使用JsonPath,我们可以轻松地定位和提取目标数据,而无需编写复杂的解析代码。同时,JsonPath还支持各种过滤器和函数,使得数据提取更加灵活和方便。

然而,在使用JsonPath时,也需要注意一些问题。首先,JsonPath的语法相对较新,需要一定的学习成本。其次,JsonPath虽然功能强大,但有时候可能会比较难以理解和调试,特别是对于复杂的数据结构和路径表达式。需要我们花费时间去学习,

在Python爬虫学习的第19天,我们一起深入了解了JsonPath这一强大的工具,它可以帮助我们更好地处理JSON格式的数据,从而提高爬虫的效率和准确性。通过学习JsonPath,我们可以更加灵活地定位和提取JSON数据中的信息,为我们的爬虫项目带来更多可能性。

在学习过程中,我们不仅掌握了JsonPath的基本语法和常用操作符,还学会了如何利用JsonPath表达式来定位和提取JSON数据中的目标信息,以及如何使用JsonPath的函数和过滤器来处理数据。这些知识不仅可以帮助我们更好地完成网页抓取和数据提取的任务,还可以为我们未来的学习和工作打下坚实的基础。

希望大家在学习过程中有所收获,也希望大家能够将所学知识应用到实际项目中,不断提升自己的技能和能力。感谢大家的参与和支持,希望我们能够在以后的学习中继续共同进步!再见喽,小伙伴们!

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

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

相关文章

Pytorch中nn.Linear使用方法

nn.Linear定义一个神经网络的线性层&#xff1a; torch.nn.Linear(in_features, # 输入的神经元个数out_features, # 输出神经元个数biasTrue # 是否包含偏置)nn.Linear其实就是对输入&#xff08;n表示样本数量&#xff0c;i表示样本特…

国产低代码工具,轻松搞定数据迁移

在日常的业务系统升级或者数据维护过程中&#xff0c;数据迁移是各个企业用户不得不面临的问题&#xff0c;尤其是数据迁移过程中要保障数据完整性、统一性和及时性&#xff0c;同时也需要注意源数据中的数据质量问题&#xff0c;比如缺失、无效、错误等问题&#xff0c;需要在…

Kubernetes中安装部署Nacos集群

目录 1、Nacos安装包的准备 1.1 下载安装包 1.2 解压安装包 1.3 修改配置文件 application.properties 1.4 bin目录下创建 docker-startup.sh 1.5 将nacos-server-1.2.1目录打包成nacos-server-1.2.1.tar.gz 2、 nacos镜像制作 2.1 Dockerfile文件编写 2.2 制作镜像…

单片机入门还能从51开始吗?

选择从51单片机开始入门还是直接学习基于ARM核或RISC核的单片机&#xff0c;取决于学习目标、项目需求以及个人兴趣。每种单片机都有其特定的优势和应用场景&#xff0c;了解它们的特点可以帮助你做出更合适的选择。 首先&#xff0c;我们说一下51单片机的优势&#xff1a; 成熟…

外包干了17天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

【石上星光】context,go的上下文存储并发控制之道

目录 1 引言2 What&#xff1f;3 How&#xff1f; 3.1 用法一、上下文数据存储3.2 用法二、并发控制 3.2.1 场景1 主动取消3.2.2 场景2 超时取消 3.3 用法三、创建一个空Context&#xff08;emptyCtx&#xff09; 4 Why&#xff1f; 4.1 go中的上下文思想 4.1.1 上下文是什么…

技术小课堂:100%CC防护是怎么实现的?

大家好&#xff0c;今天我们深入探讨的是如何有效地实现CC攻击的100%防护&#xff0c;以及传统防护手段存在的局限性和我们的定制化解决方案的优势。 传统的CC防护措施通常依赖于全局性的访问频率控制或在防火墙级别设置固定的访问次数限制。这种方式看似简单直接&#xff0c;…

安全大脑与盲人摸象

21世纪是数字科技和数字经济爆发的时代&#xff0c;互联网正从网状结构向类脑模型进行进化&#xff0c;出现了结构和覆盖范围庞大&#xff0c;能够适应不同技术环境、经济场景&#xff0c;跨地域、跨行业的类脑复杂巨型系统。如腾讯、Facebook等社交网络具备的神经网络特征&…

[方案实操|数据技术]数据要素十大创新模式(1):基于区块链的多模态数据交易服务平台

“ 区块链以其公开共享、去中心化、不可篡改、可追溯和不可抵赖等优势&#xff0c;吸引了包括金融业、医疗业和政府部门等众多利益相关方的极大兴趣&#xff0c;被认为是解决数据安全交换问题的合适方案。” 武汉东湖大数据科技股份有限公司凭借基于区块链的多模态数据交易服务…

交换机的基本原理与配置_实验案例一:交换机的初始配置

1、实验环境 实验用具包括一台Cisco交换机&#xff0c;一台PC&#xff0c;一根Console 线缆。 2、需求描述 如图5.17所示&#xff0c;实验案例一的配置需求如下。 通过PC连接并配置一台Cisco交换机。在交换机的各个配置模式之间切换。将交换机主机的名称改为BDON 3、推荐步…

OpenHarmony应用编译 - 如何在源码中编译复杂应用(4.0-Release)

文档环境 开发环境&#xff1a;Windows 11 编译环境&#xff1a;Ubuntu 22.04 开发板型号&#xff1a;DAYU 200&#xff08;RK3568&#xff09; 系统版本&#xff1a;OpenHarmony-4.0-Release 功能简介 在 OpenHarmony 系统中预安装应用的 hap 包会随系统编译打包到镜像中&a…

C语言—每日选择题—Day68

第一题 1、运行以下C语言代码&#xff0c;输出的结果是&#xff08;&#xff09; #include <stdio.h> int main() {char *str[3] {"stra", "strb", "strc"};char *p str[0];int i 0;while(i < 3){printf("%s ",p);i;} retur…

Path Aggregation Network for Instance Segmentation

PANet 摘要1. 引言2.相关工作3.框架 PANet 最初是为 proposal-based 实例分割框架提出来的&#xff0c;mask 是实例的掩码&#xff0c;覆盖了物体包含的所有像素&#xff0c;proposal 在目标检测领域是可能存在目标的区域。在实例分割中&#xff0c;首先利用RPN(Region Proposa…

【并发】第四篇 原子操作系列-AtomicInteger原子操作类详解

导航 一. 简介二. 源码分析三. 原子操作原理三. 实际用途1. 标志位2. 唯一标识生成器3. 计数器一. 简介 AtomicInteger是Java中提供的一种线程安全的原子操作类,用来实现对整数类型的原子操作。它可以在多线程环境下保证对整数的原子性操作,而不需要使用synchronized关键字或…

小样本计数网络FamNet(Learning To Count Everything)

小样本计数网络FamNet(Learning To Count Everything) 大多数计数方法都仅仅针对一类特定的物体&#xff0c;如人群计数、汽车计数、动物计数等。一些方法可以进行多类物体的计数&#xff0c;但是training set中的类别和test set中的类别必须是相同的。 为了增加计数方法的可拓…

CloudCompare——win11配置CloudComPy

CloudComPy配置 1 基本环境介绍2 安装Anaconda2.1 下载anaconda2.2 安装anaconda2.3 配置镜像源2.4 更改虚拟环境的默认创建位置2.5 其他问题2.5.1 激活自己创建的环境提示&#xff1a;系统找不到指定的路径2.5.2 InvalidVersionSpecError: Invalid version spec: 2.72.5.3 卸载…

Hibernate框架的搭建

Hibernate框架的搭建 分层体系结构与持久化 三层体系结构 分层体系结构 指的是将系统的组件分隔到不同的层中&#xff0c;每一层中的组件应保持内聚性&#xff1b; 每一层都应与它下面的各层保持松散耦合。 层与层之间存在自上而下的依赖关系&#xff0c;即上层组件会访问下…

【一学就会】(一)C++编译工具链——基于VSCode的CMake、make与g++简单理解与应用示例

目录 一、CMake、make与g 1、名词辨析 2、孰优孰劣 二、应用示例 1、工具类安装与配置 1&#xff09;VSCode安装与配置 2&#xff09;CMake下载与安装 3&#xff09;MinGW-W64下载与安装 A、科学上网法 B、无需科学上网法 4&#xff09;VSCode推荐插件 A、c/c编译环…

nandgame中的Tokenize(标记化)

题目说明&#xff1a; "Tokenize" "标记化"标记器预先配置为识别数字和符号 。请配置标记器以额外识别符号减号 - 和括号 ( 和 )。您可以编辑源代码区域中的代码以测试它的标记化。level help 我们将构建一种高级编程语言。 高级语言具有更加人性化和灵…

K8s-Ingress Nginx-Day 08

1. 什么是Ingress 官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#what-is-ingress Ingress 是 kubernetes API 中的标准资源类型之一&#xff0c;主要是k8s官方在维护。 2. Ingress的作用 Ingress 提供从集群外部到集群内服务…