湛江市国外网站建设报价,建设网站方案,提高网站订单转化率,注册无地址注册公司人生苦短#xff0c;我用 Python如果我的文章对您有帮助#xff0c;请关注支持下作者的公众号#xff1a;极客挖掘机#xff0c;您的关注#xff0c;是对小编坚持原创的最大鼓励#xff1a;)前文传送门#xff1a;小白学 Python 爬虫(1)#xff1a;开篇小白学 Python 爬…人生苦短我用 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/]这里需要注意的是此处和属性匹配的方法不同属性匹配是中括号加属性名和值来限定某个属性如 [classcontainer] 而此处的 href 指的是获取节点的某个属性二者需要做好区分。属性多值匹配某些时候吧某些节点的某个属性可能有多个值这个多见于 class 属性由于某些编码习惯以及某些其他原因这个属性经常性会出现多个值这时如果只使用其中的一个值的话就无法匹配了。如果这么写的话result_3 html.xpath(//div[classpost-head])print(result_3)结果如下[]可以看到这里没有匹配到任何节点这时我们可以使用一个函数contains() 上面的示例可以改成这样result_3 html.xpath(//div[contains(class, post-head)])print(result_3)这样通过 contains() 方法第一个参数传入属性名称第二个参数传入属性值只要此属性包含所传入的属性值就可以进行匹配了。多属性匹配除了上面的一个属性有多个值的情况还经常会出现需要使用多个属性才能确定一个唯一的节点。这时我们可以使用运算符来进行处理。还是这个示例我们获取 这个节点如果只是使用 class 属性来进行获取会获得很多个节点result_4 html.xpath(//img[classimg-ajax])print(result_4)结果如下[, , , , , , , , , , , ]如果我们加上 alt 属性一起进行匹配的话就可以获得唯一的节点result_4 html.xpath(//img[classimg-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等于price9.80如果 price 是 9.80则返回 true。如果 price 是 9.90则返回 false。!不等于price!9.80如果 price 是 9.90则返回 true。如果 price 是 9.80则返回 false。大于price9.80如果 price 是 9.90则返回 true。如果 price 是 9.80则返回 false。大于或等于price9.80如果 price 是 9.90则返回 true。如果 price 是 9.70则返回 false。or或price9.80 or price9.70如果 price 是 9.80则返回 true。如果 price 是 9.50则返回 false。and与price9.00 and price9.90如果 price 是 9.80则返回 true。如果 price 是 8.50则返回 false。mod计算除法的余数5 mod 21按顺序选择有些时候我们匹配出来很多的节点但是我们只想获取其中的某一个节点比如第一个或者最后一个这时可以使用中括号传入索引的方法获取特定次序的节点。我们还是文章的题目为例我们先获取所有的文章题目再进行选择示例代码如下result_5 html.xpath(//article/div/div/h3[classpost-title]/a/text())print(result_5)result_6 html.xpath(//article[1]/div/div/h3[classpost-title]/a/text())print(result_6)result_7 html.xpath(//article[last()]/div/div/h3[classpost-title]/a/text())print(result_7)result_8 html.xpath(//article[position() 5]/div/div/h3[classpost-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