python爬虫数据解析xpath、jsonpath,bs4

数据的解析

解析数据的方式大概有三种

  • xpath
  • JsonPath
  • BeautifulSoup

xpath

 安装xpath插件

打开谷歌浏览器扩展程序,打开开发者模式,拖入插件,重启浏览器,ctrl+shift+x,打开插件页面

安装lxml库 

安装在python环境中的Scripts下边,这里就是python库的位置,例如我的地址为:E:\python\python3.10.11\Scripts

pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple

xpath使用和基本语法

解析本地文件etree.parse( 'xx.html')4.etree.HTML()

解析服务器响应文件html_tree = etree.HTML(response.read().decode( 'utf-8')4.html tree.xpath(xpath路径)

xpath基本语法:

路径查询

        // : 查找所有子孙节点,不考虑层级关系

        /  :找直接子节点

谓词查询

        //div[@id] :包含id属性的div

        //div[@id="maincontent"] :id = maincontent的div

属性查询

        //@class :   返回指定标签的class属性

模糊查询

        //div[contains(@id,"he")] 包含

        //div[starts-with(@id,"he")] :以he开头

内容查询

        //div/h1/text() : text()显示内容

逻辑运算

      //div[@id="head" and @class="s down"] : 逻辑&& 

xpath解析本地文件 

本地文件如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
  <ul>
    <li id="00" class="beijing">北京</li>
    <li>上海</li>
    <li>深圳</li>
    <li>广州</li>
  </ul>
  <ul>
    <li id="11" class="shenyang">沈阳</li>
    <li>南京</li>
  </ul>
</body>
</html>

解析本地文件

from lxml import etree

# 解析本地文件 使用etree.parse
tree = etree.parse('Test.html')

# 找到所有的ul
ul_list = tree.xpath("//ul")

# 查找所有的li
li_list = tree.xpath("//ul/li")

# 查找所有包含id的li
id_li_list = tree.xpath("//ul/li[@id]")

# 查找id为00的li,并找到内容 注意引号问题
content_list = tree.xpath("//ul/li[@id='00']/text()")

# 查找id包含0的li的内容
contains_list = tree.xpath("//ul/li[contains(@id,'0')]/text()")

# 获取id为11的li class属性值@class
li = tree.xpath("//ul/li[@id='11']/@class")
print(ul_list)

print(li_list)

print(id_li_list)

print(contains_list)

print(content_list)

print(li)

"""
输出结果:
[<Element ul at 0x22c26c38240>, <Element ul at 0x22c26c38600>]
[<Element li at 0x22c26c38640>, <Element li at 0x22c26c385c0>, <Element li at 0x22c26c38680>, <Element li at 0x22c26c386c0>, <Element li at 0x22c26c38700>, <Element li at 0x22c26c38780>]
[<Element li at 0x22c26c38640>, <Element li at 0x22c26c38700>]
['北京']
['北京']
['shenyang']
"""

xpath解析服务器文件 

使用xpath插件检查xpath路径的匹配,解析定位dom

from lxml import etree
import urllib.request as request

# 下载图片
url = "https://www.baidu.com/"

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}

# 构建的请求对象
geneRequest=request.Request(url=url,headers = headers)
# 模拟浏览器发送请求
response = request.urlopen(geneRequest)
# 获取内容
content = response.read().decode('utf-8')

# 解析服务器文件
tree = etree.HTML(content)

# 找到百度一下的值
result = tree.xpath('//input[@id="su"]/@value')

print(result)

"""
输出结果:['百度一下']
"""

jsonpath

jsonpath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,只能读取本地的json文件,与xpath类似,只不过对应符号不同

 jsonpath安装

pip install jsonpath -i https://pypi.tuna.tsinghua.edu.cn/simple

xpath和jsonpath的对应关系 

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

jsonpath解析

准备json

  {
    "store": {
      "book":[
        { "category": "射手",
          "author": "鲁班七号",
          "title": "王者荣耀",
          "price": 8.95
        },
        {
          "category": "打野",
          "author": "李白",
          "title": "大河之水天上来",
          "price": 22.99
        }
      ],
      "bicycle": {
        "color": "red",
        "price": 19.95
      }
    }
  }

 通过jsonpath解析json数据

import json
import jsonpath

obj = json.load(open('test.json',"r",encoding="utf-8"))

# 查看store下的bicycle的color属性 $ 对应xpath/
colorAttr = jsonpath.jsonpath(obj, "$.store.bicycle.color")

# 输出book节点的第一个对象
bookFirst = jsonpath.jsonpath(obj, "$.store.book[0]")

# 输出book节点中所有对象对应的属性title值
titles = jsonpath.jsonpath(obj, "$.store.book[*].title")

# 输出book节点中所有价格小于10的对象 ?() 对应xpath  [] @ 对应当前节点
books = jsonpath.jsonpath(obj, "$.store.book[?(@.price<10)]")

print(colorAttr)

print(bookFirst)

print(titles)

print(books)

"""
输出结果:
['red']
[{'category': '射手', 'author': '鲁班七号', 'title': '王者荣耀', 'price': 8.95}]
['王者荣耀', '大河之水天上来']
[{'category': '射手', 'author': '鲁班七号', 'title': '王者荣耀', 'price': 8.95}]
"""

BeautifulSoup

Beautifulsoup简称bs4,Beautifulsoup,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据

  • 缺点: 效率没有1xm1的效率高
  • 优点: 接口设计人性化,使用方便

BeautifulSoup安装

pip install bs4  - i  https://pypi.tuna.tsinghua.edu.cn/simple

 BeautifulSoup节点定位规则

soup = soup = Beautifulsoup(response.read().decode(),'Ixml') 解析服务器文件

soup = soup = Beautifulsoup(open('1.html').lxml')  解析本地文件

根据标签名查找节点
        soup.a  只能找到第一个a
        soup.a.namesoup.a.attrs   获取标签的属性和属性值

函数查找

  .find (返回一个对象 只能找到第一个a标签)

        find('a')

        find('a',title='名字')

        find('a',class='名字')

  .find_all (返回一个列表 )

        find all('a') 

        find all(['a’,'span']) 返回所有的a和span

  .select(根据选择器得到节点对象)[推荐]

        element

                eg: div

        class

                eg:.firstname

        id

                eg:#firstname

        属性选择器

                eg:li = soup.select('li[class]')

                eg:li = soup.select('li[class="hengheng"]')

        层级选择器

                element element

                          div p

                                eg:soup = soup.select('a span')

                element>element

                          div>p

                                eg:soup = soup.select('a>span')

                element,element

                          div,p

                                eg:soup = soup.select('a,span')

BeautifulSoup节点信息

获取节点内容

        obj.string

        obj.get_text()[推荐] 

获取节点的属性

        eg:tag = find('li)

                tag.name 获取标签名

                tag.attrs将属性值作为一个字典返回

获取节点属性

        obj.attrs.get('title')[常用]

        obj.get('title')

        obj['title']

BeautifulSoup解析文件

以上述xpath中的本地文件Test.html为例,上边已经写过,这里直接上代码

from bs4 import BeautifulSoup

soup = BeautifulSoup(open('Test.html',encoding='utf-8'),'lxml')

# 查找第一个ul
print(soup.find("ul"))

# 查找所有的ul
print(soup.find_all("ul"))

# 选择查找 li class为beijing的标签
print(soup.select("li[class =beijing]"))

#层级选择查找ul下的class为beijing的li节点
nodeli=soup.select("ul li[class = beijing]")[0]

# 获取li节点内容
print(nodeli.get_text())

# 获取li标签名
print(nodeli.name)

#获取li的属性
print(nodeli.attrs)

# 获取li的id属性
print(nodeli.attrs.get('id'))

"""
输出结果:
<ul>
<li class="beijing" id="00">北京</li>
<li>上海</li>
<li>深圳</li>
<li>广州</li>
</ul>
[<ul>
<li class="beijing" id="00">北京</li>
<li>上海</li>
<li>深圳</li>
<li>广州</li>
</ul>, <ul>
<li class="shenyang" id="11">沈阳</li>
<li>南京</li>
</ul>]
[<li class="beijing" id="00">北京</li>]
北京
li
{'id': '00', 'class': ['beijing']}
00

"""

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NeuralNLP-NeuralClassifier的使用记录(一),训练预测自己的【英文文本多分类】

NeuralNLP-NeuralClassifier的使用记录&#xff0c;训练预测自己的英文文本多分类 NeuralNLP-NeuralClassifier是腾讯开发的一个多层多分类应用工具&#xff0c;支持的任务包括&#xff0c;文本分类中的二分类、多分类、多标签&#xff0c;以及层次多标签分类。支持的文本编码…

在 React 中获取数据的6种方法

一、前言 数据获取是任何 react 应用程序的核心方面。对于 React 开发人员来说&#xff0c;了解不同的数据获取方法以及哪些用例最适合他们很重要。 但首先&#xff0c;让我们了解 JavaScript Promises。 简而言之&#xff0c;promise 是一个 JavaScript 对象&#xff0c;它将…

【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】

【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】 文章目录 【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】前言整形数除法和取余数合并除法和取余数通过2的幂次进行除法和取余数取模的一种替代方法使用数组下标全局变量使用别名变量的生命周期分割变量类型局部变量指针…

开源,微信小程序 美食便签地图(FoodNoteMap)的设计与开发

目录 0 前言 1 美食便签地图简介 2 美食便签地图小程序端开发 2.1技术选型 2.2前端UI设计 2.3主页界面 2.4个人信息界面 2.5 添加美食界面 2.6美食便签界面 2.8 美食好友界面 2.9 美食圈子界面 2.10 子页面-店铺详情界面 2.11 后台数据缓存 2.12 订阅消息通知 2.1…

UI自动化测试常见的Exception

一. StaleElementReferenceException&#xff1a; - 原因&#xff1a;引用的元素已过期。原因是页面刷新了&#xff0c;此时当然找不到之前页面的元素。- 解决方案&#xff1a;不确定什么时候元素就会被刷新。页面刷新后重新获取元素的思路不变&#xff0c;这时可以使用python的…

【GitLab私有仓库】如何在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透?

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 前言 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xf…

【Nginx17】Nginx学习:目录索引、字符集与浏览器判断模块

Nginx学习&#xff1a;目录索引、字符集与浏览器判断模块 今天要学习的内容有几个还是大家比较常见的&#xff0c;所以学习起来也不会特别费劲。对于目录的默认页设置大家都不会陌生&#xff0c;字符集的设置也比较常见&#xff0c;而浏览器的判断这一块&#xff0c;可能有同学…

XenDesktop5.6如何连接数据库

Citrix在数据库的连接方式上一直不统一&#xff0c;但是也还是有迹可循的。 经过了好长时间的下载以后&#xff0c;今天终于有时间来测试一下最新版本的XenDesktop 5 SP1&#xff0c;由于结合了其他组件和环境的需要&#xff0c;所以&#xff0c;选择了独立部署数据库&#xf…

【学习笔记之opcua】使用Python获取opcua数据

Python与OPC UA的应用 示例代码 将代码放入spyder中运行后&#xff0c;出现下面这个错误 没有‘opcua’&#xff0c;那我们就下载pip install opcua 之后出现下面这个错误 问问题大不&#xff0c;安装语句写错了 正经安装语句是 !pip install opcua 读取opcua协议数据测试 …

若依框架给字典字段新增color值,并且实现下拉列表选项进行颜色设置

首先获取所要新增的字典&#xff0c;并且根据字典的value值选取对应的颜色参数 this.getDicts("risk_level").then(response > {const color {mild:#F1F4BD,moderate:#EEC920,severe:#FF6C0D,very_severe:#FF0000,no_harm:green};const res response.data.map(…

深兰科技熊猫汽车牵手首恒出行,人工智能技术提升商用车运营服务

8月8日&#xff0c;深兰科技集团旗下熊猫新能源汽车(上海)有限公司(下称熊猫新能源汽车)与河南首恒出行服务有限公司(下称首恒出行)在深兰科技总部举行签约仪式&#xff0c;首恒出行将向熊猫新能源汽车年定向采购10000台商用车&#xff0c;双方将在汽车后市场领域进行技术合作。…

如何在出差期间远程访问企业ERP系统?内网穿透解决您的难题!

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻&#xff0c;不管是财务、生产、销售还是采购&#xff0c;都需要用到ERP系统来协助。…

动画制作选择Blender还是Maya

Blender和Maya是两种最广泛使用的 3D 建模和动画应用程序。许多经验丰富的用户表示&#xff0c;Blender 在雕刻工具方面远远领先于 Maya&#xff0c;并且在 3D 建模方面达到了相同的质量水平。对于刚接触动画行业的人来说&#xff0c;您可能会问“我应该使用 Blender 还是 Maya…

【操作系统】24王道考研笔记——第一章 计算机系统概述

第一章 计算机系统概述 一、操作系统基本概念 1.1 定义 1.2 特征 并发 &#xff08;并行&#xff1a;指两个或多个事件在同一时刻同时发生&#xff09; 共享 &#xff08;并发性指计算机系统中同时存在中多个运行着的程序&#xff0c;共享性指系统中的资源可供内存中多个并…

网络连接(3次握手和4次挥手)

在进行3次握手和4次挥手传输数据时&#xff0c;都可能会出现丢包的情况&#xff0c;推荐看出现丢包问题的情况以及解决方法 一.为什么要进行3次握手&#xff1f; 在进行网络连接时&#xff0c;需要3次握手 3次握手的初心就是两方面&#xff1a; 1.投石问路&#xff0c;验证通…

HDMI接口的PCB布局布线要求

高清多媒体接口&#xff08;High Definition Multimedia Interface&#xff09;&#xff0c;简称&#xff1a;HDMI&#xff0c;是一种全数字化视频和声音发送接口&#xff0c;可以发送未压缩的音频及视频信号。随着技术的不断提升&#xff0c;HDMI的传输速率也不断的提升&#…

【力扣每日一题】1572. 矩阵对角线元素的和 8.11打卡

文章目录 题目思路代码 题目 1572. 矩阵对角线元素的和 难度&#xff1a; 简单 描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 返回合并后的二叉树。 注意…

企业权限管理(十)-用户详情

用户详情 UserController findById方法 Controller RequestMapping("/user") public class UserController {Autowiredprivate IUserService userService;//查询指定id的用户RequestMapping("/findById.do")public ModelAndView findById(String id) thro…

【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基本介绍登场角色应用场景 案例实现案例一类图实现 案例二&#xff1a;借贷平台源码剖析传统方式实现分析状态修改流程类图实现 案例三&#xff1a;金库警报系统系统的运行逻辑伪代码传统实现方式使用状态模式 类图实现分析问题问题一问题二 总结文章说明…

【广州华锐视点】VR线上教学资源平台提供定制化虚拟现实学习内容

虚拟现实&#xff08;VR&#xff09;技术的出现为我们提供了一种全新的在线教学方式。由广州华锐视点开发的VR线上教学资源平台&#xff0c;作为一个综合性的学习工具&#xff0c;正在教育领域迅速发展&#xff0c;并被越来越多的教育机构和学生所接受。那么&#xff0c;VR线上…