Python爬虫 xpath解析基础

news2024/11/24 3:27:05

今天继续给大家介绍Python爬虫相关知识,本文主要内容是Python爬虫 xpath解析基础。

一、xpath简介

xpath,即XML Path Language,是一种用来确定XML文档中某部分位置的语言,Xpath以XML为基础,可以提供用户在数据结构树中寻找数据节点的能力,也常常被用于Python爬虫中对于HTML文档的解析。并且相对于re正则表达式和BeautifulSoup相比,xpath具有便捷高效的特点,且具有一定的通用性。
要使用xpath进行解析,那么首先需要安装lxml库,安装命令为:

pip install lxml

二、xpath简单使用

在lxml库中,存在一个etree的对象,如果想使用xpath进行解析,那么就需要先从lxml库中引入该对象,执行命令:

from lxml import etree

在代码中,我们首先需要实例化一个etree对象,然后将被解析的页面源码数据加载到该对象中,然后调用etree对象的xpath方法,利用xpath表达式,就可以实现指定标签的定位和标签内容的捕获。
将页面源码数据加载到该对象中代码如下所示:

page_text=requests.get(url).text
tree=etree.HTML()

此外,xpath还支持从本地的html文档中导入数据,代码如下所示:

tree=etree.parse(FilePath)

使用xpath方法进行标签定位和内容捕获代码如下所示:

tree.xpath(【xpath表达式】)

三、xpath表达式

实际上,在xpath解析中,最重要的就是xpath表达式,xpath表达式决定了我们可以提取出什么样的数据。xpath表达式是一个指定格式的字符串,xpath方法返回的是一个列表,列表中存储的是符合xpath表达式的element对象。

(一)xpath表达式层级递进关系表示

xpath表达式采用层级关系来定位数据,斜杠“/”表示层级关系的递进。例如:

'/html/head/title'

即表示从根节点出发,根节点下的html标签下的head标签下的title标签。
单个斜杠表示一层递进,我们也可以采用两个斜杠来表示多层关系递减,例如:

'/html/body//div'

就可以提取html标签下的body标签下的的所有的div标签。
此外,当我们获取一个标签后,还可以以该标签为基础,再次提取该标签下的子标签,例如:

tree1=tree.xpath('//div[@class="test"]')[0]
tree2=tree1.xpath('./p/a//text()')

在上述代码中,我们第一次使用了正常的xpath表达式提取除了div标签,因为该xpath函数返回的结果是一个列表,因此在这里我们必须取出列表中的元素。这样,tree1即是一个div标签。在第二次使用xpath表达式时,我们以tree1为基础,在xpath表达式中使用了“./”表示本级,这样就可以以tree1中提取出的div标签为基础,进而提取该div标签下的标签了。

(二)xpath表达式标签属性定位和索引定位

xpath表达式还支持属性定位,我们可以使用如下格式:

[@【属性变量】="【属性值】"]

来定位指定属性的元素,例如:

'//div[@id="item"]'

这种xpath表达式就可以定位id属性为item的div标签。
xpath除了可以使用标签属性进行定位以外,还可以使用标签索引进行定位,例如:

'//div[@id="item"]/p[1]'

上述xpath表达式表示在指定的div标签下的第一个p标签,这里的标签索引从1开始计数。

(三)xpath表达式获取标签文本和属性

xpath表达式还支持获取标签的文本,例如:

'//div[@class="text"/a/text()]'

就可以获取指定的a标签下的文本,如果我们把上述xpath表达式修改为:

'//div[@class="text"]/a//text()'

那么也可以获取指定的a标签下的文本,这两者之间的区别在于后者的xpath表达式中text()方法前面存在两条斜杠,而前者的xpath表达式中的text()方法前面只有一条斜杠。结果中的区别在于前者只能够获取a标签中直系文本,而后者可以获取a标签中的所有文本,即如果a标签里面还有别的标签,那么两条斜杠的xpath表达式可以获取这些标签下的所有标签中的文本。
xpath表达式也可以获取标签中的数据,例如:

'//div[@class=text]//a/@href'

上述xpath表达式就可以获取指定a标签中的href属性。

四、xpath解析示例

为了让大家更好的理解xpath解析,简单编写了一段简单的python代码,代码如下所示:

from lxml import etree
import requests

headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"}
page_text=requests.get(url='https://www.baidu.com/',headers=headers).text
tree=etree.HTML(page_text)
#使用xpath表达式层级递进关系获取标签
xpath_list1=tree.xpath('/html/head/title//text()')
print(xpath_list1)
#使用xpath表达式标签属性进行定位
xpath_list2=tree.xpath('//*[@id="bottom_layer"]/div/p/a/text()')
print(xpath_list2)
#使用xpath表达式标签索引进行定位
xpath_list3=tree.xpath('//*[@id="bottom_layer"]/div/p[1]/a/text()')
print(xpath_list3)
#使用xpath表达式两种text()方法获取文本数据
xpath_list4=tree.xpath('//*[@id="bottom_layer"]//text()')
print(xpath_list4)
xpath_list5=tree.xpath('//*[@id="bottom_layer"]/text()')
print(xpath_list5)
#使用xpath表达式获取标签中的属性
xpath_list6=tree.xpath('//*[@id="bottom_layer"]//a/@href')
print(xpath_list6)

上述代码执行结果如下所示:
在这里插入图片描述

五、通过浏览器获得xpath表达式

我们在学习了上述xpath表达式以后,就可以很方便的使用xpath表达式来提取数据了。但是对于一个比较复杂的网页,使用xpath表达式来提取数据是一件不那么简单的事情。然而,现在的浏览器有自动复制xpath表达式的功能,我们在打开浏览器开发者工具后,就可以在里面直接复制xpath表达式了,如下所示:
在这里插入图片描述
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

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

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

相关文章

8、可观测性--链路追踪

文章目录链路追踪服务之间的依赖Span 的构成Span 之间关系链路图链路追踪与 Dapper链路追踪的作用链路查询性能分析拓扑图依赖关系跨应用/语言采样率链路追踪 首先,我来带你了解一下什么是链路追踪? 服务之间的依赖 在前言中介绍了数据的来源&#xf…

运营|为什么需要配置https?

什么是HTTPS、它带来了什么? 从名字来看,它比http多了一个“s”,这个“s”表示安全。目的在于提供更安全的HTTP通道,即HTTP下加入SSL层并且加密。太详细的我就不再这里说了,再说我就要抄百度百科了。简单来说,不同于HTTP使用80端口,HTTPS使用443端口,HTTPS还需要一个付…

【手写 Vue2.x 源码】第七篇 - 阶段性梳理

一,前言 上篇,介绍了 Vue 数据初始化流程中,Vue 实例上数据代理的实现,核心思路如下: 将 data 暴露在 vm._data 实例属性上利用 Object.defineProperty 将 vm.xxx 操作代理到 vm._data 上 本篇,对当前版本的数据劫持…

[VP]河南第十三届ICPC大学生程序竞赛 J.甜甜圈

前言 传送门 : https://ac.nowcoder.com/acm/contest/17148/J 题意 : 给定两个甜甜圈堆 , 每次只能吃所有中最甜的那一个 , 否则的话就移动 询问最小的移动步骤 思路 : 很明确的一个目标 , 寻找当前最大值并且求出距离 那么我们考虑将两个甜甜圈堆进行合并 , 使得变成一个…

LeetCode:17. 电话号码的字母组合

17. 电话号码的字母组合1)题目2)思路3)代码4)结果1)题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同…

【C++入门】C向C++过渡(上)

前言在正式进入C之前,我们首先要对C有一个基本的认知。这里我就不过多的进行描述了,有兴趣的可以去网络搜索一番。总而言之,从名称上面我们也可以看得出来,C是在C的基础上进行不断地优化发展。事实上确实是这样,C语言中…

k8s部署gitlab

Gitlab以容器方式运行,需要持久化如下几个目录中的数据: 持久化本地位置 容器位置 使用 ${sc}/data /var/opt/gitlab 用于存储应用程序数据。 ${sc}/logs /var/log/gitlab 用于存储日志。 ${sc}/config /etc/gitlab 用于存储 GitLab 配置 文件。 1、下载…

C语言柔性数组的‘美‘

目录 柔性数组的使用和概念 柔性数组的特点 柔性数组与指针的区别 柔性数组的好处 柔性数组的使用和概念 arr[]编译 C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。 柔性数组的特点 1、柔性数组成员前必须至少有一个其他…

黑龙江创维E900V22C_S905L3(B)_安卓9.0_开启设置隐藏无线_完美线刷固件包

黑龙江创维E900V22C_S905L3(B)_安卓9.0_开启隐藏设置无线WIFI_完美线刷固件包 提示:大部分芯片均为S905L3A/AB,这两个是可以通刷的。 1、此分享固件包芯片特殊,芯片为S905L3,还有S905L3B芯片,理论上通刷…

C++设计模式:建造者模式(详解+案例代码)

文章目录建造者模式实现步骤实现代码案例一: 组装电脑案例二:汉堡店点餐优缺点建造者模式 建造者模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式…

【JavaEE】设计模式之单例模式

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【JavaEE】 ✈️✈️本篇内容:设计模式之单例模式。 🚀🚀代码存放仓库gitee:JavaEE初阶代码存放! ⛵⛵作者简介&am…

Redis 连接池报错:jwtCalibrateHandler 48 max number of clients reached

问题[ERROR 2023-01-06 15:37:58,877] jwtCalibrateHandler 48 max number of clients reached早上突然看到反馈说redis连接异常,就是这个:max number of clients reached。问题很显然就是redis连接数超了.原因分析redis maxclients 是redis server的重要…

VMware vCenter Server Appliance空间不足问题处理

原创作者:运维工程师 谢晋 前提提要 客户环境为VSAN环境,VCSA版本为6.7,偶然间发现VSAN监控的性能不能正常打开,如下图:     后登陆https://VCSAIP:5480发现出现告警,报错log日志满了 故障处理 开…

rabbitmq+netcore6 【3】Publish/Subscribe:发布/订阅

文章目录1)前言2)临时队列3)绑定4)综合以上代码准备工作1、生产者2、消费者13、消费者25)验证官网教程原文链接: https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html翻译版参考链接&#xff1…

大话测试数据(二):概念测试数据的获取

在大话测试数据(一)文章中,我提到,获取数据的第一步是获取概念上数据。这一步看起来简单,其实不是那么容易。获取概念数据和获取需求的过程是交织在一起的,事实上,它们其实是一个事儿&#xff0…

Ribbon、Feign、Hystrix超时重试熔断问题

文章目录问题描述重试次数不生效开启熔断后重试次数生效fallbackFactory回退降级异常为空问题1分析问题2、3分析总结feign请求次数计算Hystrix超时时间设置公式问题描述 在使用Ribbon、Feign、Hystrix组合时,因为配置的问题出现以下现象,让我的大脑CPU烧…

[SWPU2019]Web1

目录 [SWPU2019]Web1 无列名查看表数据 不使用列名查询表中数据 [SWPU2019]Web1 首先我们先注册,登录进来后看到如下界面: 我们点击申请发布广告,并发送: 查看广告详情,发现疑似存在注入点: 于是我们在发…

Docker 应用篇 | Docker 学习笔记总结

Docker 视频内容可以参考黑马程序员的Docker篇 详细完整内容可以查询菜鸟教程:Docker 教程 本篇博文主要让读者对Docker有一个基本理解并可以借助Docker发布自己的项目 一、初识Docker 1.1 Docker概述 Docker是一个集装箱式的思想 Docker可以让开发者打包他们的…

招聘求职系统|基于Springboot+Vue+Nodejs实现求职招聘系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

电脑系统更新后桌面的文件全部不见了怎么恢复?

电脑系统更新是很常见的一种情况,自动更新电脑系统后我们可以进行更优质的使用体验,但是最近有位小伙伴,出现了win10电脑系统更新后桌面文件丢失情况,那么电脑系统更新桌面文件没了怎么办?电脑系统更新桌面文件不见了怎…