Python爬虫解析工具之xpath使用详解

news2025/1/13 10:20:37

文章目录

  • 一、数据解析方式
  • 二、xpath介绍
  • 三、环境安装
    • 1. 插件安装
    • 2. 依赖库安装
  • 四、xpath语法
  • 五、xpath语法在Python代码中的使用

一、数据解析方式

爬虫抓取到整个页面数据之后,我们需要从中提取出有价值的数据,无用的过滤掉。这个过程称为数据解析,也叫数据提取。数据解析的方式有多种,按照网站数据来源是静态还是动态进行分类,如下:

  1. 动态网站:字典取值。动态网站的数据一般都是JS发过来的,基本都是json格式数据,我们只需要将json格式转换为字典进行取值。
  2. 静态网站:xpath取值 + 正则取值

说明:爬虫开发中,用的最多的数据解析方式是字典取值和xpath取值,占到80%以上,其余的少部分是正则取值。

二、xpath介绍

xpath全称XML Path Language,即XML路径语言。它是一门在XML文档中查找信息的语言,最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。

xpath的选择功能十分强大,它提供了非常简明的路径选择表达式。另外,它还提供了众多的内建函数,用于字符串、数值、时间的匹配处理等,几乎所有我们想要定位的节点,都可以用XPath来选择

三、环境安装

1. 插件安装

很多爬虫的初学者由于对解析工具语法的不熟练,经常会有这种情况:抓来的数据经过解析之后发现不是自己要的,就会多次调试代码,直至提取出精确的价值数据,这样就会导致爬虫多次频繁请求网站,结果自己的IP被网站封掉。那有没有好的办法规避这种情况呢?

有的,Chrome浏览器支持众多插件,其中就有适合xpath语法的元素查找插件:XPath Helper,在谷歌应用商店可以搜索安装,安装好之后图标如下图所示:

在这里插入图片描述

使用该插件的方法很简单,在Chrome浏览器中,打开任意网页之后,同时按下 Ctrl+Shift+X 键就可以看到网页上方的XPath Helper调试窗口,左边窗口是要输入的xpath语法右边窗口是该xpath语法定位出的结果展示。这样就非常方便我们写爬虫项目,如果不确定解析出的结果是不是我们想要的,就可以先在调试窗口中多次调试,结果没有错误,再直接把该代码复制到我们的爬虫代码中运行,如下图:

在这里插入图片描述

2. 依赖库安装

在Python代码中,若要使用xpath解析,需要安装lxml这个第三方库,它对xpath语法提供了良好的支持,安装lxml库步骤如下:

1.同时按下win + R键,打开运行框,在里面输入cmd,点击确定

在这里插入图片描述

2.来到控制台中,输入安装命令:pip install lxml -i https://mirrors.aliyun.com/pypi/simple/,然后按下回车键,等候安装完成,出现“Successfully installed …”字样即为安装成功。

在这里插入图片描述

四、xpath语法

xpath语法,也叫xpath路径表达式。因为xpath查找内容是按照HTML代码的标签树结构搜索的,每一个标签都有自己的父标签子标签,比如下图这组HTML代码所示:

<body>
	 <div>
	      <a href="/ershoufang/dongcheng/"  title="北京东城在售二手房 ">东城</a>
	      <a href="/ershoufang/xicheng/"  title="北京西城在售二手房 ">西城</a>
	      <a href="/ershoufang/chaoyang/"  title="北京朝阳在售二手房 ">朝阳</a>
	      <a href="/ershoufang/haidian/"  title="北京海淀在售二手房 ">海淀</a>
	</div>
</body>

代码中的 body 标签就是 div 标签的父标签,同理,div 标签是 body 标签的子标签。标签之间的这种父子关系用xpath语法表示的话就是用 / 分隔,比如我们要找 a 标签,xpath写法就是:div/a,或者 body/div/a。这种就类似我们的电脑上面文件路径表示方法,故而,xpath语法又叫xpath路径表达式

看到上面这些,有的小伙伴可能会纳闷:既然找 a 标签,干嘛不直接写 a 就行了,怎么写这么多父子关系进行约束呢?是不是多此一举了?

在这里插入图片描述

没关系,看看下面这组代码图片:

在这里插入图片描述

如果说要在上面这组代码中找到高亮显示的这行 “2室1厅 | 53平米 | 南 北 | 精装 | 中楼层(共5层) | 板楼” 文字,单单输入 span 标签能找到吗?显然不能,因为里面有多个 span 标签,所以,使用xpath路径表达式的用意,就是希望使用标签的父子关系约束,来精确定位到我们要找的那个标签。

讲了这么多,接下来我们就看看xpath路径表达式的常用规则。使用xpath规则匹配查找的源码如下:

<body>
	 <div>
	      <a href="/ershoufang/dongcheng/"  title="北京东城在售二手房 ">东城</a>
	      <a href="/ershoufang/xicheng/"  title="北京西城在售二手房 ">西城</a>
	      <a href="/ershoufang/chaoyang/"  title="北京朝阳在售二手房 ">朝阳</a>
	</div>
</body>

/    表示两个相邻元素节点关系,也可以说父子关系
用法示例:如果要找上述代码中的 a 标签,路径表达式为:div/a

注意:如果当前查找出来的标签有多个,比如上面查找到的 a 标签有3个,我们想要第2个,写法就是 div/a[2],同理,我们需要第几个标签,就在标签后面加上[顺序值]

//     表示两个不相邻元素节点关系,也可以说爷孙这种隔代关系
用法示例:还是从上述代码中找 a 标签,路径表达式还可以写为:body//a

注意:// 也表示从任意位置开始检索,而不考虑它们的位置。xpath查找标签的顺序正常是从HTML文档头部开始查找,当一个HTML文档中标签非常多,我们查找的标签位于文档的中间某位置。如果直接从头部标签开始一级级往下检索,非常繁琐。用 “// + 标签名” 就相当于从该标签开始检索书写。比如我们还是要找 a 标签,可以写成 //a。

.     指代当前节点,比如xpath路径表达式找到某个元素后,想在此元素基础上往后面查找其他元素,那么前面的路径表达式就可以省略,用 . 替换

@     选取属性,作用就是更精确定位某个标签
用法示例:比如上面我们正常查找的 a 标签是有3个,我们还是要找第2个 a 标签,已经学了一种方法就是 a 标签后面加上[顺序值]。但是如果 a 标签有几十个呢,我们就要一个个数顺序,很繁琐也容易出错。这时候就可以通过标签自身的属性值来精确定位某个标签。我们仔细可以看出上面的每个 a 标签里面的 href 和 title 两个属性值都是彼此不同的,那我们要找第2个,可以这样写://a[@href=“/ershoufang/xicheng/”] 或者 //a[@title="北京西城在售二手房 "]。格式就是:标签名[@属性名=属性值]

text()     提取标签中的文本内容
用法示例:上面的几种方式定位的都是某个标签,如果要拿到标签中的详细内容,比如要拿到第2个 a 标签的文本内容 “西城”这两个字,写法是://a[@title="北京西城在售二手房 "]/text()。格式是:标签/text()

注意:/text()一定要写在标签及标签属性值后面,因为属性值是修饰该标签的,可以精确定位到某个标签,其次后面才加/text(),表示该标签的文本内容。当然定位的标签如果无需属性值作为修饰即可找到,则直接就是标签名加上/text()。

@属性名     提取标签内指定属性名的属性值
用法示例:上面我们提取了标签的文本内容,但是有时候可能需要提取标签内的某个属性名对应的属性值。比如要提取第2个 a 标签中 title 的属性值 “北京西城在售二手房” 这句话,写法是://a[@title="北京西城在售二手房 "]/@title 或者 //a[2]/@title 都可以。格式是:标签/@属性名

以上就是开发中最常见的xpath表达式,记住这些对于日后解析爬虫来说就完全够用了。当然xpath还有许多其他路径表达式,有兴趣的小伙伴也可以额外探索。

五、xpath语法在Python代码中的使用

上面介绍的只是xpath路径表达式,但是如何实际在Python代码中使用呢?这就需要用到上面提到的依赖库 lxml 了。因为我们用爬虫抓取到的网页源码虽然是HTML文档,但是其实是字符串类型的数据,如下图抓取房源信息代码所示:

在这里插入图片描述

xpath解析的是html或者lxml文档中的标签元素对象,不是字符串。我们就需要将抓到的字符串类型源码转换为html或者lxml文档中的标签元素对象,然后就可以正常使用xpath路径表达式进行解析查找。

如何将字符串内容转换成标签元素对象,要使用 lxml 库里面的 etree 模块中的 HTML() 方法,语法格式如下:

from lxml import etree  # 导入 lxml 库中的 etree 模块
变量名 = etree.HTML(网页源码)  # 使用 etree 模块的 HTML() 方法,括号中就是爬虫拿到的字符串类型的网页源码,将转换后的标签对象用变量保存

代码示例如下图所示:

在这里插入图片描述

转换为标签元素对象之后,就可以正常使用上面介绍的xpath路径表达式了,语法格式如下:

标签元素对象.xpath('路径表达式')  # 标签元素对象就是我们刚刚转换好的,括号里面的是双引号或者单引号都可以,包裹的就是路径表达式

代码示例如下图所示:

在这里插入图片描述

注意:在Python代码中,xpath路径表达式最终拿到的解析结果是以列表形式返回的,如果没有解析到目标数据,结果为空列表。

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

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

相关文章

网络技术Vlan技术STP(第一课)

一 Vlan技术的学习 对命令的增删改查 #### 1&#xff09;创建vlan[SW1]vlan 2 [2-4094] 创建vlan[SW1]vlan batch 10 20 30 创建多个不连续的vlan[SW1]display vlan 查看vlan信息[SW1]vlan batch 50 to 60创建多个连续的vlan[SW1]vlan2[SW1-vlan2]description caiwu添加描述信…

基于决策树(Decision Tree)的乳腺癌诊断

决策树(DecisionTree)学习是以实例为基础的归纳学习算法。算法从--组无序、无规则的事例中推理出决策树表示形式的分类规则,决策树也能表示为多个If-Then规则。一般在决策树中采用“自顶向下、分而治之”的递归方式,将搜索空间分为若千个互不相交的子集,在决策树的内部节点(非叶…

AutoSAR配置与实践(基础篇)3.3 BSW的通信功能

传送门 -> AUTOSAR配置与实践总目录 AutoSAR配置与实践&#xff08;基础篇&#xff09;3.3 BSW的通信功能 一、收发过程概览1.1 发送过程概览1.2 接收过程概览 二、BSW的通信功能模块组成三、收发过程解析3.1 发送过程3.2 发送后的结果确认3.3 接收过程 一、收发过程概览 1…

图像编程补充:计算机图形学和数字图像处理概念

一、计算机图形学 国际标准化组织&#xff08;ISO&#xff09;的定义&#xff1a;计算机图形学是研究通过计算机将数据转换为图形&#xff0c;并在专门显示设备上显示的原理、方法和技术的学科。 1.1什么是计算机图形学 图形的构成要素&#xff1a; 图形的广义概念&#xff1…

TCP拥塞控制简单理解

1.TCP的控制机制 序号 TCP通过序号可以实现一下几个功能&#xff1a; 1.确认应答处理。发送端收到接收端的确认应答&#xff0c;可以得知某些数据包被接收端接收了 2.顺序控制。接收端可以利用序号对接收到的报文进行排序 3.重发控制。如果发送端没有收到确认应答&#xff0c…

【MT32F006】MT32F006之定时器延时

本文最后修改时间&#xff1a;2023年03月30日 一、本节简介 本文介绍如何使用MT32F006的定时器做us、ms级的延时。 二、实验平台 库版本&#xff1a;V1.0.0 编译软件&#xff1a;MDK5.37 硬件平台&#xff1a;MT32F006开发板&#xff08;主芯片MT32F006&#xff09; 仿真器…

【C语言】每日一题(找到所有数组中消失的数字)

找到所有数组中消失的数字&#xff0c;链接奉上。 这里简单说一下&#xff0c;因为还没有接触到动态内存&#xff0c;数据结构&#xff0c;所以知识有限&#xff0c;也是尽力而为&#xff0c;结合题库的评论区找到了适合我的解法&#xff0c;以后有机会&#xff0c;会补上各种…

麻辣烫数据可视化,麻辣烫市场将持续蓬勃发展

麻辣烫&#xff0c;这道源自中国的美食&#xff0c;早已成为人们生活中不可或缺的一部分。它独特的香辣口味&#xff0c;让人忍不住每每流连忘返。与人们的关系&#xff0c;简直如同挚友一般。每当寒冷的冬日或疲惫的时刻&#xff0c;麻辣烫总是悄然走进人们的心房&#xff0c;…

Winload.efi丢失或损坏怎么办?

Winload.efi是一个EFI&#xff08;或可扩展固件接口&#xff09;文件。可执行的EFI文件适用于基于计算机系统的UEFI&#xff0c;并将文件加载到计算机引导加载程序的执行任务。它们包含有关操作系统引导过程应如何进行的重要数据。因此&#xff0c;Winload.efi文件对于成功启动…

大数据Flink学习圣经:一本书实现大数据Flink自由

学习目标&#xff1a;三栖合一架构师 本文是《大数据Flink学习圣经》 V1版本&#xff0c;是 《尼恩 大数据 面试宝典》姊妹篇。 这里特别说明一下&#xff1a;《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来&#xff0c; 已经汇集了 好几百题&#xff0c;大量的大厂面试…

第一章 初识Linux(含VMware安装Ubuntu、CentOS、Windows、FinalShell、快照)

目录 一、 课程的介绍  1.为什么要学习Linux  2.课程的安排  3.如何学习Linux 二、操作系统概述  1.学习目标  2.计算机的硬件和软件  3.什么是操作系统  4.常见的操作系统  5.本小节的总结 三、初识Linux  1.学习目标  2.Linux的诞生  3.Linux的内核  …

CentOS下MySQL的彻底卸载的几种方法

这里我为大家详细讲解下“CentOS下MySQL的彻底卸载的几种方法”的完整攻略。 一、关闭MySQL服务 在开始操作之前&#xff0c;需要先关闭MySQL服务。可以使用以下命令来关闭MySQL服务&#xff1a; systemctl stop mysqld 或者 service mysqld stop 二、使用yum命令卸载MySQL…

Oracle的学习心得和知识总结(二十七)|Oracle数据库数据库回放功能之论文一翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

Kotlin开发笔记:集合和逆变协变

Kotlin开发笔记&#xff1a;集合和逆变协变 Kotlin中的集合 基本的集合类型 Kotlin中的集合类型和Java差不多&#xff0c;不过有些在名称上可能有出入&#xff0c;下面是Kotlin中的一些基本集合类型&#xff1a; 类型介绍Pair两个值的元组Triple三个值的元组Array经过索引的…

word内怎么快速选择图片

前一阵子想把图片中央对齐&#xff0c;这就需要一点一点向下划那个滚轮&#xff0c;非常麻烦。 新建个文档演示下&#xff1a; 这样的内容一共有三页。太乱&#xff1f;不我觉得我平时看文献得时候脑子里就是上面这个情况&#xff0c;很有代入感。 选择选择&#xff0c;在左侧出…

QGraphicsView 实例3地图浏览器

主要介绍Graphics View框架&#xff0c;实现地图的浏览、放大、缩小&#xff0c;以及显示各个位置的视图、场景和地图坐标 效果图: mapwidget.h #ifndef MAPWIDGET_H #define MAPWIDGET_H #include <QLabel> #include <QMouseEvent> #include <QGraphicsView&…

vue实现文件上传,前后端

前端封装el-upload组件&#xff0c;父组件传值dialogVisible&#xff08;用于显示el-dialog&#xff09;&#xff0c;子组件接收&#xff0c;并且关闭的时候返回一个值&#xff08;用于隐藏el-dialog&#xff09;,最多上传五个文件&#xff0c;文件格式为.jpg\pdf\png <tem…

Redis缓存问题(穿透, 击穿, 雪崩, 污染, 一致性)

目录 1.什么是Redis缓存问题&#xff1f; 2.缓存穿透 3.缓存击穿 4.缓存雪崩 5.缓存污染&#xff08;或满了&#xff09; 5.1 最大缓存设置多大 5.2 缓存淘汰策略 6.数据库和缓存一致性 6.1 4种相关模式 6.2 方案&#xff1a;队列重试机制 6.3 方案&#xff1a;异步更新缓…

Lnton羚通关于Optimization在【PyTorch】中的基础知识

OPTIMIZING MODEL PARAMETERS &#xff08;模型参数优化&#xff09; 现在我们有了模型和数据&#xff0c;是时候通过优化数据上的参数来训练了&#xff0c;验证和测试我们的模型。训练一个模型是一个迭代的过程&#xff0c;在每次迭代中&#xff0c;模型会对输出进行猜测&…

mqtt开关实现

这个项目的主要需求其实并不复杂&#xff0c;只是需要让用户可以在小程序上控制预约后的自习室座位的灯和柜子等的开关。这里的关键是需要通过一个网络应用来转发用户对智能硬件的控制请求。 物联网应用的主要几个难点及对应的思路如下&#xff1a; 通信数据量小、通信环境不…