人生苦短,我用 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() 来进行获取,如图:

代码如下:

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 帮我们生成的,具体操作可见下图:

这时 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 属性,由于某些编码习惯以及某些其他原因,这个属性经常性会出现多个值,这时如果只使用其中的一个值的话,就无法匹配了。

如果这么写的话:

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() 方法,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以进行匹配了。

多属性匹配

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

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

还是这个示例,我们获取 这个节点,如果只是使用 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

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

  1. 同花顺python_小白学 Python 爬虫(25):爬取股票信息

    人生苦短,我用 Python 如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:) 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Py ...

  2. 小白学vb还是python_小白学 Python 爬虫(30):代理基础

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  3. python 爬虫框架_小白学 Python 爬虫(28):自动化测试框架 Selenium (下)

    人生苦短,我用 Python 如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:) 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Py ...

  4. 小白学 Python 爬虫(26):为啥上海二手房你都买不起

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  5. 小白学 Python 爬虫(27):自动化测试框架 Selenium 从入门到放弃(上)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  6. 小白学 Python 爬虫(25):爬取股票信息

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

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

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. 小白学 Python 爬虫(20):Xpath 进阶

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

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

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

最新文章

  1. 敲代码、作诗、写论文无所不能!史上最大AI模型GPT-3强势霸榜Github
  2. addcontorl error...viewstate relative
  3. amd的处理器能兼容idea么_250元就能买到16GB内存 这背后究竟是道德的沦丧还是人性的扭曲?...
  4. Python File(文件) 方法
  5. 计算机学不学工程制图,大一,马上要考试了,不想再学工程制图了?
  6. 基于HTML5的贪吃蛇游戏的设计与实现
  7. php curl exec ch,PHP curl_exec函数的用法实例详解
  8. linux过滤重复字符串,linux – 从制表符分隔文件中删除重复的单词/字符串
  9. CCF201412-4 最优灌溉(100分)
  10. javascript探秘-检测浏览器和操作系统
  11. 56相册视频(土豆相册视频 激动相册视频 QQ动感影集等)——下载教程
  12. 从nexus下载所有jar包方法 迁移到其他nexus中
  13. C语言基础入门:C-Free5新建C语言工程
  14. 基于Cassandra的分布式存储数据一致性算法研究
  15. 数据挖掘工具主要有哪几种?
  16. phpadmin安装到mysql中,mysql 和phpadmin安装
  17. 微信公众号入门详细教程
  18. 怎么让上下两排对齐_怎么让WORD中多行(常带下划线)头和尾都完全对齐
  19. C# 实现飞行棋小游戏
  20. 微信小程序合法域名配置

热门文章

  1. 深入理解并行编程-分割和同步设计(四)
  2. PPC系统常见启动项(StartUp)解说
  3. 写模拟挂用什么工具?
  4. 【机器学习】SVM理论与python实践系列
  5. 打开word2016总是出现很抱歉,此功能看似中断需要修复。。问题解决办法
  6. halcon/c++接口基础 之 halcon初认识
  7. 最新的一些开源face alignment及评价
  8. C++11系列学习之四----auto
  9. 微型计算机中使用的光盘应属于什么媒体,计算机应用基础练习题
  10. python适合什么样的人群_什么样的人比较适合选择Python开发+人工智能技术?