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

news2024/10/6 1:37:33

数据的解析

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

  • 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

"""

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

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

相关文章

windows11下配置vscode中c/c++环境

本文默认已经下载且安装好vscode&#xff0c;主要是解决环境变量配置以及编译task、launch文件的问题。 自己尝试过许多博客&#xff0c;最后还是通过这种方法配置成功了。 Linux(ubuntu 20.04)配置vscode可以直接跳转到配置task、launch文件&#xff0c;不需要下载mingw与配…

C#_字符串

String类型 字符串是信息最重要载体&#xff0c;相对于图像、语音、视频更易读易处理&#xff1b;C#字符串具有 不可变 特征&#xff0c; 从使每一次修改都要需要申请内存空间&#xff0c;并且需要复制源字符串到新的内存空间&#xff0c;还要需要销毁原有空间。 优势&#x…

前端实现文件预览功能

前端实现文件预览功能 ❝ 需求&#xff1a;实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍&#xff1a;支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能&#xff0c;建议以下的预览文件标签可以在外层包裹一层弹窗。 ❞ 图片预览 iframe标签…

详细安装配置django

安装配置使用Django。 1&#xff0c;下载安装 django pip install django 2.创建设置项目 先进入要放置项目的文件夹下 2.1&#xff0c; 创建项目 django-admin startproject Api_project 2.2&#xff0c; 创建app命令 cd Api_project dir看一下是否有 manage.py 文件…

ORB-SLAM2第五节---局部地图跟踪(阶段二)

保证三种跟踪方式更加准确 1.局部关键帧 当前帧F的局部关键帧包括&#xff1a; 能够观测到当前帧F中地图点的共视关键帧KF1、KF2&#xff0c;称为一级共视关键帧。一级共视关键帧的共视关键帧&#xff08;前10个共视程度最高的关键帧&#xff09;&#xff0c;比如图中的KF1的…

取证--实操

2022年美亚杯个人赛 运用软件DB Browser for SQLite &#xff08;一款用于查看SQLlite数据库文件的浏览器工具&#xff09; 火眼&#xff0c;盘古石手机取证系统等 案件详情 于2022年10月&#xff0c;有市民因接获伪冒快递公司的电邮&#xff0c;不慎地于匪徒架设的假网站提…

分类预测 | MATLAB实现CNN-BiGRU-Attention多输入分类预测

分类预测 | MATLAB实现CNN-BiGRU-Attention多输入单输出分类预测 目录 分类预测 | MATLAB实现CNN-BiGRU-Attention多输入单输出分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现CNN-BiGRU-Attention多特征分类预测&#xff0c;卷积双向门控循环…

qemu简单使用

参考&#xff1a; 记一次全设备通杀未授权RCE的挖掘经历 claude1 安装使用 附件下载 下载后拖到虚拟机 解压 使用root用户 运行.sh脚本即可 运行脚本解读 #!/bin/bashsudo qemu-system-mipsel \-cpu 74Kf \-M malta \-kernel vmlinux-3.2.0-4-4kc-malta \ -hda debian…

Rabbitmq延迟消息

目录 一、延迟消息1.基于死信实现延迟消息1.1 消息的TTL&#xff08;Time To Live&#xff09;1.2 死信交换机 Dead Letter Exchanges1.3 代码实现 2.基于延迟插件实现延迟消息2.1 插件安装2.2 代码实现 3.基于延迟插件封装消息 一、延迟消息 延迟消息有两种实现方案&#xff…

PyQt5下拉列表实现及信号与槽的连接

目录 1、常用方法 2、常用信号 3、实操 1、常用方法 QComboBox() 创建一个下拉框对象addItems 可以使用列表进行多个下拉框内容添加, 单个添加用addItemcurrentIndexChanged 是用来获取当前选择下拉框的索引, 这也是这个"信号"槽函数需要 有个索引传参, 这样就便…

优化查询性能:UNION与UNION ALL的区别

作用 在SQL查询中&#xff0c;当我们需要合并多个查询结果集时&#xff0c;我们通常会使用UNION和UNION ALL操作符&#xff0c;同时&#xff0c;如果你写的or语句不走索引&#xff0c;可以考虑使用UNION、UNION ALL优化。 在本篇博客中&#xff0c;我们将探讨UNION和UNION AL…

Lnux系统usb摄像头测试程序(一)

这是linux或国产系统上&#xff08;UOS、麒麟&#xff09;USB摄像头的测试程序&#xff0c;主要功能有 1、系统上USB摄像头的配置查询&#xff0c;包括摄像头支持的协议&#xff0c;支持的分辨率等信息 、视频预览&#xff08;支持yuv422和RGB两种格式 3、录像录音 4、视频编码…

值传递、形参实参的关系、地址传递(指针和函数)

1 值传递 实现两个数字进行交换&#xff0c;代码和运行结果如下所示&#xff1a; #include<iostream> using namespace std;void change(int a, int b) {int temp a;a b;b temp;cout << "change a " << a << endl;cout << "…

raw socket是啥(一)?

对于网络通讯&#xff0c;耳熟能详的莫过于TCP、UDP&#xff0c;二者皆需要ip和port。对于一般开发人员&#xff0c;找到一个“能用”的库就可以了&#xff0c;因为流式通讯&#xff0c;会有粘包问题&#xff0c;那就需要再加一个库&#xff0c;解决粘包问题&#xff0c;这样一…

【量化课程】02_4.数理统计的基本概念

2.4_数理统计的基本概念 数理统计思维导图 更多详细内容见notebook 1.基本概念 总体&#xff1a;研究对象的全体&#xff0c;它是一个随机变量&#xff0c;用 X X X表示。 个体&#xff1a;组成总体的每个基本元素。 简单随机样本&#xff1a;来自总体 X X X的 n n n个相互…

大数据平台中元数据库—MySQL的异常故障解决

本文的主要目标是解决大数据平台中元数据库MySQL的异常故障。通过分析应用响应缓慢的问题&#xff0c;找到了集群组件HIVE和元数据库MySQL的原因。通过日志分析、工具检测和专家指导等一系列方法&#xff0c; 最终确定问题的根源是大数据集群中租户的不规范使用所导致&#xff…

冠达管理:机构密集调研医药生物股 反腐政策影响受关注

进入8月&#xff0c;跟着反腐事件发酵&#xff0c;医药生物板块呈现震荡。与此一起&#xff0c;组织出资者对该板块上市公司也展开了密集调研。 到昨日&#xff0c;8月以来就有包含南微医学、百济神州、维力医疗、方盛制药等12家医药生物板块的上市公司接受组织调研&#xff0c…

【0810作业】Linux中基于UDP的TFTP文件传输(下载、上传)

一、tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输。 特点&#xff1a; ① 是应用层协议 ② 基于UDP协议实现 ③ 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&#xff09;mail&#xff1a;已经不…

易服客工作室:PressMart – 现代Elementor WooCommerce WordPress商城主题

PressMart是现代且独特的 Elementor WooCommerce WordPress商城主题。它配备了高品质的 05 预建主页&#xff0c;适合任何在线商店&#xff0c;如时装店、电子产品商店、家具店等。 我们使用 Elementor – 一个拖放页面构建器&#xff0c;不需要用户的编码技能即可轻松编辑和构…

图解WebSocket

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱写博客的嗯哼&#xff0c;爱好Java的小菜鸟 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;个人博客&#xff1a;敬请期待 文章目录 前言一、…