python网页爬虫xpath应用

2023-11-09

一、认识xpath和xml数据

lxml是Python基于xpath做数据解析的工具

from lxml import etree

1.xpath数据解析 - 通过提供标签路径来获取标签(xpath指的就是标签的路径)

1) xpath基本感念

树: 整个html内容或者整个xml内容
节点:树结构中的每个标签(元素)就是一个节点
根节点:树结构中的第一个节点就是根节点(网页对应树的根节点是html标签)
节点内容:双标签的标签内容
节点属性:标签的标签属性

2) 路径 - 目标节点在整个树结构中的位置信息

2.xml数据格式

xml和json都是通用的数据格式,可以用于不同编程语言的程序之间进行数据交流。
json更小更快;xml更安全

用json和xml两种数据格式来传输一个班级的信息:
1)json
{
“name”: “goodstudy”,
“teacher”: {
“name”: “niuzi”,
“tel”: “1100”,
“age”: 18
},
“students”:[
{“name”: “小明”, “age”: 18, “tel”: “120”, “gender”: “男”},
{“name”: “张三”, “age”: 22, “tel”: “119”, “gender”: “女”},
{“name”: “老王”, “age”: 30, “tel”: “140”, “gender”: “男”}
]
}

2)xml


niuzi
1100
18






二、xpath语法

在说明这个语法前
现在当前目录建一个xml文件
在这里插入图片描述
data.xml文件内容如下

<supermarket>
    <name>永辉超市</name>
    <staffs>
        <staff>
            <name class="c1">张三</name>
            <position>收营员</position>
            <salary>3500</salary>
        </staff>
        <staff>
            <name>小明</name>
            <position class="c1">收营员</position>
            <salary>3800</salary>
        </staff>
        <staff>
            <name class="c1">小花</name>
            <position>导购</position>
            <salary>4500</salary>
        </staff>
        <staff>
            <name>李华</name>
            <position>导购</position>
            <salary>5500</salary>
        </staff>
    </staffs>

    <goodsList>
        <goods>
            <name class="c1">面包</name>
            <price>5.5</price>
            <count>12</count>
        </goods>
        <goods tag="hot">
            <name>泡面</name>
            <price class="c1">3.5</price>
            <count>59</count>
        </goods>
        <goods tag="discount" discount="0.8">
            <name>火腿肠</name>
            <price>1.5</price>
            <count>30</count>
        </goods>
        <goods tag="hot">
            <name>矿泉水</name>
            <price>2</price>
            <count>210</count>
        </goods>
    </goodsList>

</supermarket>

节奏开始,导入模块

from lxml import etree

1.创建树获取树的根节点

etree.XML(xml数据)
etree.HTML(html数据)

root = etree.XML(open('data.xml', encoding='utf-8').read())

2.通过xpath路径获取节点(标签)

节点对象.xpath(路径) - 获取指定路径对应的所有的标签

xpath语法(路径的写法):
1)绝对路径:不管xpath点前面是哪个标签,绝对路径都是以’/‘开头,从根节点开始往后写
2)相对路径:在写路径的时候用’.‘表示当前节点,用’…‘表示当前节点的上层节点。谁去点的xpath当前节点就是谁
3)全路径:在写路径的时候用’//'开头,获取标签的时候是在整个树中获取所有满足路径结构的标签

1)绝对路径

staff_names = root.xpath('/supermarket/staffs/staff/name')
print(staff_names)

在路径的最后加'/text()'可以获取标签内容
result = root.xpath('/supermarket/staffs/staff/name/text()')
print(result)       # ['张三', '小明', '小花']

注意:不断xpath前面是谁去点的,写绝对路径的时候都必须从根节点开始写

goodsList = root.xpath('/supermarket/goodsList')[0]
result = goodsList.xpath('/supermarket/goodsList/goods/price/text()')
print(result)

2)相对路径

result = root.xpath('./staffs/staff/name/text()')
print(result)

goodsList = root.xpath('/supermarket/goodsList')[0]
result = goodsList.xpath('./goods/price/text()')
print(result)

相对路径中’./‘开头的时候,’./'可以不写

result = goodsList.xpath('goods/price/text()')
print(result)

3)全路径

result = root.xpath('//name/text()')
print(result)

result = root.xpath('//goods/name/text()')
print(result)

3. xpath的谓语(条件) - 在路径中需要添加条件的节点后加’[谓语]’

1)和位置相关条件

[N]     -   第N个节点
[last()]    -   最后一个节点
[last()-N]      -  [last()-1]: 倒数第2[position()>N][position()<N][position()>=N][position()<=N]
"""
result = root.xpath('//staffs/staff[2]/name/text()')
print(result)

result = root.xpath('//staffs/staff[last()]/name/text()')
print(result)

result = root.xpath('//staffs/staff[last()-1]/name/text()')
print(result)

result = root.xpath('//staffs/staff[position()<=2]/name/text()')
print(result)

2)和属性相关条件

[@属性名=值] - 获取指定属性为指定值的标签
[@属性名] - 获取拥有指定属性的标签

result = root.xpath('//goodsList/goods[@tag]/name/text()')
print(result)

result = root.xpath('//goods[@tag="hot"]/name/text()')
print(result)

3)和子标签内容相关条件

[子标签名=值] - 获取指定子标签的标签内容为指定值的标签
[子标签名>值] - 获取指定子标签的标签内容大于指定值的标签

result = root.xpath('//goods[price=3.5]/name/text()')
print(result)

result = root.xpath('//goods[count>=50]/name/text()')
print(result)

4.获取标签内容和标签属性

获取标签内容: 获取标签的路径/text() - 获取路径选中的所有的标签的标签内容
获取标签内容: 获取标签的路径/@属性名 - 获取路径选中的所有的标签的指定属性的值

result = root.xpath('//goods[2]/@tag')
print(result)

goods_names = root.xpath('//goods/name')
for x in goods_names:
    print(x.xpath('./text()')[0])

5.在xpath路径中可以用*来代替任何标签或者任何属性

result = root.xpath('//goods[1]/*/text()')
print(result)

result = root.xpath('//*[@class="c1"]/text()')
print(result)

result = root.xpath('//goodsList/goods[3]/@*')
print(result)

6.若干(分支) - |

路径1|路径2 - 依次获取|分开的所有路径对应的内容

result = root.xpath('//goods/name/text()|//staff/name/text()')
print(result)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python网页爬虫xpath应用 的相关文章

随机推荐

  • Grafana ALert功能使用webhook,并预警数据信息

    使用webhook预警的时候如果能够同时获取预警的数据信息是最好不过的 这里我们就来看下怎么获取这些东西 数据源依然选用InfluxDB 具体配置过程可以参考前边两篇文章 现在从webhook配置开始 无参对接 在Grafana的Alert
  • LeetCode108.将有序数组转换为二叉搜索树

    题目来源 108 将有序数组转换为二叉搜索树 力扣 LeetCode 二叉搜索树定义 二叉搜索树 Binary Search Tree 又 二叉查找树 二叉排序树 它或者是一棵空树 或者是具有下列性质的 二叉树 若它的左子树不空 则左子树上
  • 2023华为OD机试真题【处理器问题/深度优先搜索】

    题目描述 某公司研发了一款高性能AI处理器 每台物理设备具备8颗AI处理器 编号分别为0 1 2 3 4 5 6 7 编号0 3的处理器处于同一个链路中 编号4 7的处理器处于另外一个链路中 不同链路中的处理器不能通信 现给定服务器可用的处
  • mysql 读写分离

    读写分离引入时机 大多数互联网业务中 往往读多写少 这时候数据库的读会首先成为数据库的瓶颈 如果我们已经优化了SQL 但是读依旧还是瓶颈时 这时就可以选择 读写分离 架构了 读写分离首先需要将数据库分为主从库 一个主库用于写数据 多个从库完
  • C/C++中浮点数的存储方式

    原文地址 C C 中浮点数的存储方式 作者 andyhzw 根据国际标准IEEE 754 任意一个二进制浮点数V可以表示成下面的形式 V 1 s M 2 E 1 1 s表示符号位 当s 0 V为正数 当s 1 V为负数 2 M表示有效数字
  • 使用umi3和antd pro5从零实现全栈中后台管理系统

    0 前言 使用umi3和antd pro5从零实现全栈中后台管理系统 0 1 涉及技术栈 前端 TS React React Hooks umi3 antd pro5 后端 express mongodb jwt 0 2 实现的功能 后端用
  • STM32CUBEMX F103 HAL库开发 两路定时器的Encoder编码器模式

    机器人开发过程中 对于直流电机来说 编码器至关重要 它不仅可以使我们对电极进行精确的速度闭环 位置闭环 还可以通过时间积分 根据运动学关系 获得速度 位置等信息 STM32的定时器有编码器模式 大大的方便我们的开发 使用STM32cubeM
  • 刨根问底:C++中浮点型变量(float, double)的比较问题。

    首先 让我们先来看一段代码 include
  • CVE-2022-25845 反序列化漏洞分析

    测试环境 jdk1 8 fastjson 1 2 80 win10 实验POC public class Poc extends Exception public void setName String str try Runtime ge
  • python __next__()方法_Python迭代器的用法,next()方法的调用

    迭代器的用法 首先说两个概念 一个是可迭代的对象 一个是迭代器对象 两个不同 可迭代的 Iterable 就是可以for循环取数据的 比如字典 列表 元组 字符串等 不可使用next 方法 迭代器 Iterator 也是可以依次迭代取出数据
  • msrcr图像增强算法 matlab,图像处理之Retinex增强算法(SSR、MSR、MSRCR)

    视网膜 大脑皮层 Retinex 理论认为世界是无色的 人眼看到的世界是光与物质相互作用的结果 也就是说 映射到人眼中的图像和光的长波 R 中波 G 短波 B 以及物体的反射性质有关 其中I是人眼中看到的图像 R是物体的反射分量 L是环境光
  • BugkuCTF-MISC题粗心的佳佳

    下载得到3个文件 预期解法应该是根据图片写出脚本 把混淆过的二维码恢复 我发现照着password png也能看出原本的二维码大概长啥样 手动修复得到一张二维码 扫码得到IXE1VDYmMjk base64解码得到压缩包密码 q5T6 29
  • GUI Guider设计UI界面移植到STM32

    GUI Guider设计UI界面移植到STM32 一 什么是GUI Guider 什么是 GUI Guider GUI Guider 是恩智浦为 LVGL 开发了一个上位机GUI 设计工具 可以通过拖放控件的方式设计 LVGL GUI 页面
  • java热部署

    Class forName和ClassLoader loadClass 简书 Eclipse安装热部署热加载插件JRebel 免费版 idea也可用 that summer CSDN博客 Eclipse中使用JRebel实现项目热部署 Ma
  • 【自定义表单】自定义表单设计

    1 后端设计1 diy field pool 字段池 我们定义好的字段类型 diy form 表单表 记录用户自定义的表单 diy form field 表单字段表 记录某张表单中有哪些字段 diy form entity 表单实例表 记录
  • XP下VMware模拟Ubuntu不能使用共享文件夹问题解决vmhgfs

    目前XP下使用VMware workstation 6 0 2虚拟ubuntu后 即使安装了VMware Tools并设置了共享文件夹后 虽然可以看到 mnt hgfs 但仍旧不能访问共享目录的解决方案 问题 主要问题是在安装vmware
  • 向较长的字符串中的指定位置添加指定元素

    今天抓取数据的时候获取到多个url中的翻页数据 但是单个url又需要进行翻页的操作 因此就需要在url中指定的位置添加新的参数用于数据的翻页 如何在指定位置添加指定的参数呢 下面通过一个例子来说明 url https list tmall
  • Qt线程之间通过signal和slot传递数据

    Qt线程之间通过signal和slot传递数据 这种方法主要是为了设置自己定义的数据类型 在不同的线程之间进行通信 如果自己定义的数据类型未经处理之间传递会报如下错误 QObject connect Cannot queue argumen
  • OpenSea进阶之路:成立4年估值超百亿美元

    来源 Odaily星球日报 作者 Jeff Kauflin 2022 新年伊始 加密行业迎来的第一个好消息就是 Opensea 这个 NFT市场的王者在 1 月 5 日宣布完成了一笔高达 3 亿美元的 C 轮融资 估值更是飙升到 130 亿
  • python网页爬虫xpath应用

    一 认识xpath和xml数据 lxml是Python基于xpath做数据解析的工具 from lxml import etree 1 xpath数据解析 通过提供标签路径来获取标签 xpath指的就是标签的路径 1 xpath基本感念 树