class参数传入 python_小白学 Python 爬虫(20):Xpath 进阶

9ba1ed992295e0dc21c8313d7fa29877.png

人生苦短,我用 Python

如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:)

前文传送门:

小白学 Python 爬虫(1):开篇

小白学 Python 爬虫(2):前置准备(一)基本类库的安装

小白学 Python 爬虫(3):前置准备(二)Linux基础入门

小白学 Python 爬虫(4):前置准备(三)Docker基础入门

小白学 Python 爬虫(5):前置准备(四)数据库基础

小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装

小白学 Python 爬虫(7):HTTP 基础

小白学 Python 爬虫(8):网页基础

小白学 Python 爬虫(9):爬虫基础

小白学 Python 爬虫(10):Session 和 Cookies

小白学 Python 爬虫(11):urllib 基础使用(一)

小白学 Python 爬虫(12):urllib 基础使用(二)

小白学 Python 爬虫(13):urllib 基础使用(三)

小白学 Python 爬虫(14):urllib 基础使用(四)

小白学 Python 爬虫(15):urllib 基础使用(五)

小白学 Python 爬虫(16):urllib 实战之爬取妹子图

小白学 Python 爬虫(17):Requests 基础使用

小白学 Python 爬虫(18):Requests 进阶操作

小白学 Python 爬虫(19):Xpath 基操

引言

文接上篇,我们接着聊,上篇我们介绍了 Xpath 一些常用的匹配方式, DOM 节点我们可以匹配出来了,这并不是我们的最终目的,我们是要从这些节点中取出来我们想要的数据。本篇我们接着介绍如何使用 Xpath 获取数据。

文本获取

我们先尝试下获取第一篇文章的题目,获取节点中的文本我们可以使用 text() 来进行获取,如图:

95bd204948feaed71b6e0f1e25bec565.png

代码如下:

from lxml import etreeimport requestsresponse = requests.get('https://www.geekdigging.com/')html_str = response.content.decode('UTF-8')html = etree.HTML(html_str)result_1 = html.xpath('/html/body/section/div/div/main/article[1]/div[2]/div/h3/a/text()')print(result_1)

结果如下:

['小白学 Python 爬虫(18):Requests 进阶操作']

哇,上面示例里面的表达式好长啊,这个怎么写出来的,怎么写的稍后再说,先介绍一下这个表达式的意思,仔细看一下,这个表达式其实是从整个 HTML 源代码的最外层的 标签写起,一层一层的定位到了我们所需要的节点,然后再使用 text() 方法获取了其中的文本内容。

关于这个表达式怎么来的,肯定不是小编写的,这么写讲实话是有点傻,完全没必要从整个文档的最外层开始写。

其实这个是 Chrome 帮我们生成的,具体操作可见下图:

3c95ee00ade3d3f32ad65e9f3298c845.png

这时 Chrome 会自动帮我们把这个节点的表达式 copy 到当前的剪切板上,只需要我们在程序里 ctrl + v 一下。

属性获取

有些情况下,我们可能不止需要节点中的文本数据,可能还会需要节点中的属性数据,比如上面的示例,我们除了想知道文章标题,其实还想知道文章的跳转路径:

result_2 = html.xpath('/html/body/section/div/div/main/article[1]/div[2]/div/h3/a/@href')print(result_2)

结果如下:

['/2019/12/11/1468953802/']

这里需要注意的是,此处和属性匹配的方法不同,属性匹配是中括号加属性名和值来限定某个属性,如 [@class="container"] ,而此处的 @href 指的是获取节点的某个属性,二者需要做好区分。

属性多值匹配

某些时候吧,某些节点的某个属性可能有多个值,这个多见于 class 属性,由于某些编码习惯以及某些其他原因,这个属性经常性会出现多个值,这时如果只使用其中的一个值的话,就无法匹配了。

e10b1c2f8934db8e219bc8b8da1dee38.png

如果这么写的话:

result_3 = html.xpath('//div[@class="post-head"]')print(result_3)

结果如下:

[]

可以看到,这里没有匹配到任何节点,这时,我们可以使用一个函数:contains() ,上面的示例可以改成这样:

result_3 = html.xpath('//div[contains(@class, "post-head")]')print(result_3)

这样通过 contains() 方法,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以进行匹配了。

多属性匹配

除了上面的一个属性有多个值的情况,还经常会出现需要使用多个属性才能确定一个唯一的节点。

这时,我们可以使用运算符来进行处理。

4400b658e56884c8ad85b55e5007a299.png

还是这个示例,我们获取 这个节点,如果只是使用 class 属性来进行获取,会获得很多个节点:

result_4 = html.xpath('//img[@class="img-ajax"]')print(result_4)

结果如下:

[, , , , , , , , , , , ]

如果我们加上 alt 属性一起进行匹配的话,就可以获得唯一的节点:

result_4 = html.xpath('//img[@class="img-ajax" and @]')print(result_4)

结果如下:

[]

Xpath 支持很多的运算符,详细见下表(来源:https://www.w3school.com.cn/xpath/xpath_operators.asp)

运算符描述实例返回值计算两个节点集//book //cd返回所有拥有 book 和 cd 元素的节点集+加法6 + 410-减法6 - 42*乘法6 * 424div除法8 div 42=等于price=9.80如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 false。!=不等于price!=9.80如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。大于price>9.80如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。>=大于或等于price>=9.80如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 false。or或price=9.80 or price=9.70如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 false。and与price>9.00 and price<9.90如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 false。mod计算除法的余数5 mod 21

按顺序选择

有些时候,我们匹配出来很多的节点,但是我们只想获取其中的某一个节点,比如第一个或者最后一个,这时可以使用中括号传入索引的方法获取特定次序的节点。

我们还是文章的题目为例,我们先获取所有的文章题目,再进行选择,示例代码如下:

result_5 = html.xpath('//article/div/div/h3[@class="post-title"]/a/text()')print(result_5)result_6 = html.xpath('//article[1]/div/div/h3[@class="post-title"]/a/text()')print(result_6)result_7 = html.xpath('//article[last()]/div/div/h3[@class="post-title"]/a/text()')print(result_7)result_8 = html.xpath('//article[position() < 5]/div/div/h3[@class="post-title"]/a/text()')print(result_8)

结果如下:

['小白学 Python 爬虫(18):Requests 进阶操作', '小白学 Python 爬虫(17):Requests 基础使用', '小白学 Python 爬虫(16):urllib 实战之爬取妹子图', '如何用 Python 写一个简易的抽奖程序', '小白学 Python 爬虫(15):urllib 基础使用(五)', '我们真的在被 APP “窃听” 么?', '小白学 Python 爬虫(14):urllib 基础使用(四)', '小白学 Python 爬虫(13):urllib 基础使用(三)', '小白学 Python 爬虫(12):urllib 基础使用(二)', '小白学 Python 爬虫(11):urllib 基础使用(一)', '老司机大型车祸现场', '小白学 Python 爬虫(10):Session 和 Cookies']['小白学 Python 爬虫(18):Requests 进阶操作']['小白学 Python 爬虫(10):Session 和 Cookies']['小白学 Python 爬虫(18):Requests 进阶操作', '小白学 Python 爬虫(17):Requests 基础使用', '小白学 Python 爬虫(16):urllib 实战之爬取妹子图', '如何用 Python 写一个简易的抽奖程序']

第一次,我们选取了当前页面所有的文章的题目。

第二次,我们选择了当前页面第一篇文章的题目,这里注意下,中括号中传入数字1即可,这里的开始是以 1 为第一个的,不是程序中的 0 为第一个。

第三次,我们使用 last() 函数,获取了最后一篇文章的题目。

第四次,我们选择了位置小于 5 的文章题目。

节点轴

轴可定义相对于当前节点的节点集。

轴名称结果ancestor选取当前节点的所有先辈(父、祖父等)。ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身。attribute选取当前节点的所有属性。child选取当前节点的所有子元素。descendant选取当前节点的所有后代元素(子、孙等)。descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身。following选取文档中当前节点的结束标签之后的所有节点。namespace选取当前节点的所有命名空间节点。parent选取当前节点的父节点。preceding选取文档中当前节点的开始标签之前的所有节点。preceding-sibling选取当前节点之前的所有同级节点。self选取当前节点。

我们以 ancestor 轴来做示例:

# 节点轴示例# 获取所有祖先节点result_9 = html.xpath('//article/ancestor::*')print(result_9)# 获取祖先节点 main 节点result_10 = html.xpath('//article/ancestor::main')print(result_10)

结果如下:

[, , , , , ][]

关于节点轴就先介绍到这里,更多的轴的用法可以参考:https://www.w3school.com.cn/xpath/xpath_axes.asp 。

示例代码

本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。

示例代码-Github

示例代码-Gitee

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

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

相关文章

shellcode

Shellcode实际是一段代码&#xff08;也可以是填充数据&#xff09;&#xff0c;是用来发送到服务器利用特定漏洞的代码&#xff0c;一般可以获取权限。 另外&#xff0c;Shellcode一般是作为数据发送给受攻击服务的。 Shellcode是溢出程序和蠕虫病毒的核心&#xff0c;提到它…

小学生都能看懂的FFT!!!

小学生都能看懂的FFT&#xff01;&#xff01;&#xff01; 前言 在创新实践中心偷偷看了一天FFT资料后&#xff0c;我终于看懂了一点。为了给大家提供一份简单易懂的学习资料&#xff0c;同时也方便自己以后复习&#xff0c;我决定动手写这份学习笔记。 食用指南&#xff1a; …

ComboBox自动补全小技巧

网上看的自动补全实在是太麻烦&#xff0c;有时候还用到了第三方控件&#xff0c;但是现在我的需求是这样的 有一个Person类&#xff0c;其中有Code、Name两个属性 Person需要绑定到ComboBox中&#xff0c;在ComboBox中输入Code时&#xff0c;即自动补全相应的Name 想了半天&am…

可做fft分析吗_小吃店生意好做吗,小吃业行情分析

现在创业已经成为一种风尚&#xff0c;不少创业者都打算开一家小吃店&#xff0c;现在小吃店的生意好做吗&#xff1f;开小吃店有没有前景呢&#xff1f;中国人一直以来都非常看重“吃”&#xff0c;民以食为天&#xff0c;食物就是中国人生存的灵魂所在。基本上每个城市、每个…

SVN版本回滚

新入职的公司居然还是用的SVN管理代码&#xff0c;需要版本回滚&#xff0c;弄了半天&#xff0c;顺便记录一下。 当前的最新版本号是1470&#xff0c;其中1467到1470这几个提交都要被移除时&#xff0c;在项目文件夹下使用下面的代码&#xff1a; svn merge -r 1470:1466 . 这…

ase加密放linux报错_Linux应用安装有福啦!和苹果Mac一样方便的单文件安装

自从用了苹果macbook&#xff0c;和windows基本上就再见了&#xff0c;苹果系统的稳定性太出色了&#xff0c;使用完合上盖子放十天半个月的没一点问题&#xff0c;一叫就醒&#xff0c;一醒就能接着工作&#xff0c;windows系统不行&#xff0c;要么睡了叫不醒&#xff0c;要么…

我的软考之路——软考心得

软考&#xff1f;是什么东西&#xff0c;可能大多数人跟我一样&#xff0c;刚听到这个词语觉得很陌生&#xff0c;但当我走进社会&#xff0c;面临到工作的压力&#xff0c;要求自己必须学习进步的时候&#xff0c;认识了它! 那时候参加工作也几年了&#xff0c;工作的压力是…

拼图展示

转载于:https://www.cnblogs.com/zm1994/p/8033332.html

[转载]TopCoder兼职赚钱入门(Part. 1)

原文地址&#xff1a;【原创】TopCoder兼职赚钱入门&#xff08;Part. 1&#xff09;作者&#xff1a;汪昊成最近找我问TC的朋友越来越多&#xff0c;于是就想写一个入门教程放在这里。对我来说&#xff0c;TC目前是总收入的一个重要组成部分&#xff0c;虽然不如工资多&#x…

c++全局监听ctrl s_号称史上最全!134个CAD快捷键强烈来袭,难道你只知道Ctrl+C?...

想要提高CAD绘图速率你就必须熟记CAD快捷键&#xff0c;小编盘点了134个CAD个快捷键&#xff0c;号称史上最全&#xff0c;一起来看看吧。一、常用字母键CO&#xff1a;复制MI&#xff1a;镜像AR&#xff1a;阵列O&#xff1a;偏移RO&#xff1a;旋转M&#xff1a;移动E&#x…

51nod 1623 完美消除(数位DP)

首先考虑一下给一个数如何求它需要多少次操作。 显然用一个单调栈就可以完成&#xff1a;塞入栈中&#xff0c;将比它大的所有数都弹出&#xff0c;如果栈中没有当前数&#xff0c;答案1。 因为数的范围只有0~9&#xff0c;所以我们可以用一个二进制数来模拟这个栈&#xff0c;…

Javascript-7对象:字符串、时间

JavaScript-7对象:字符串、时间字符串&#xff08;String&#xff09;对象&#xff1a; Javascript是面向对象的编程语言&#xff0c;我们可以定义自己的对象和变量类型。 计算字符串长度&#xff1a; var txt"Hello world!" document.write(txt.length) 结果为&…

代码 拉取_Git 利用 Webhooks 实现代码的自动拉取

WebHook 简介WebHook 功能是帮助用户 push 代码后&#xff0c;自动回调一个您设定的 http 地址。 这是一个通用的解决方案&#xff0c;用户可以自己根据不同的需求&#xff0c;来编写自己的脚本程序。环境服务器&#xff1a;ubuntuphp&#xff1a;7.2.28本文以拉取码云&#xf…

Git 分布式版本控制常用命令(1)

安装完成后,标定自己身份,配置自己的姓名与邮箱git config --global user.name "Name" git config --global user.email "examplemail.com" 初始化Git仓库git init 添加文件到Git仓库git add <file> git commit -m "Add some comment" 查看…

数据结构最短路径例题_数据结构算法实验8图的最短路径问题附源代码.doc

浙江大学城市学院实验报告课程名称 数据结构与算法实验项目名称 实验八 图的最短路径问题实验成绩 指导老师(签名 ) 日期实验目的和要求掌握图的最短路径概念。理解并能实现求最短路径的DijKstra算法(用邻接矩阵表示图)。二. 实验内容1、编写用邻接矩阵表示有向带权图时图的基本…

navicat连接mysql报10061错

可能原因&#xff1a;mysql服务未启动 解决办法&#xff1a;进入到计算机管理&#xff0c;找到服务&#xff0c;然后找到mysql服务&#xff0c;并启动该服务 转载于:https://www.cnblogs.com/mengyinianhua/p/8041201.html

长牙顺序

20个乳牙宝宝的诞生是有顺序的&#xff0c;虽然不一定一成不变&#xff0c;但是也可以作为参照的依据。 1.下乳中切牙 2.上乳中切牙 3.上乳侧切牙 4.下乳侧切牙 5.下第一乳磨牙 6.上第一乳磨牙 7.下乳尖牙 8.上乳尖牙 9.下第二乳磨牙 10.上第二乳磨牙 5~10个月&…

疲劳容器的定义_材料疲劳

结构力学材料疲劳什么是材料疲劳&#xff1f;材料疲劳 是一种结构在循环载荷作用下出现失效的现象。即使材料受到的应力远低于材料的静态强度&#xff0c;也可能会发生这种类型的结构损伤。疲劳是造成机械结构失效最常见的原因。组件在反复载荷作用下导致最终失效的过程&#x…

python天蝎座-day1笔记

一、接口测试即功能测试 最常见&#xff1a; get post 二、jmeter参数化有三种方法&#xff1a; 1、jmeter-选项-函数助手对话框-random-输入最小值和最大值&#xff0c;生成-将生成的函数字符串赋值到需要函数化的参数 2、添加配置元件&#xff1a;CSV Data Set Config&#x…

国产海量存储系统的新突破

3月8—14日&#xff0c;“十一五”国家重大科技成就展在北京国家会议中心举行。本次展览集中展出了一批对国民经济和社会发展有着重大影响、具有重大创新与突破和自主知识产权的重大标志性项目。 本次参展的项目约600项&#xff0c;参展实物近1000件&#xff0c;模型150多件。信…