学习笔记
编辑器:Sublime
注意:这里的理论部分是关于XML文档的,但是介于HTML和XML的相似性,大家可以自行做类比,有的地方我也会用HTML和XML做类比。

上一篇:Xpath路径表达式


文章目录

  • 谓词
    • 谓词的格式与作用
    • 寻找特殊位置的节点
    • 寻找有特殊属性的节点
    • 寻找有特殊关系节点的节点
    • 使用谓词嵌套寻找节点

谓词

谓词是定位步中最吸引人的部分。真的很吸引人!!!

谓词的格式与作用

谓词的目的是给出定位步所寻找出的节点需满足的进一步条件,即当前节点在使用定位步的轴和节点测试找出若干个节点后,再使用谓词从这些节点中筛选出满足条件的节点。

谓词格式:

[条件表达式]

谓词中的条件表达式和节点有关,其值为ture或false,当条件表达式的值是true时,称节点满足谓词给出的条件,否则称节点不满足谓词给出的条件。

在谓词中,用or, and来表示逻辑关系,使用=, !=, <=, <, >=, >表示大小关系。

例如:

[position() >= 4 and position <= 6]

表示筛选出第4、5、6位置的节点.

如果比较的内容是数值类型,则既可以用关系符=, !=, <=, <, >=, >,比较大小关系。如果比较的内容为字符串类型,则只能用关系符=, !=,比较两个字符串是否相同。

现给出一个简单的HTML文档(这个文档,之后也要用到),我们将这个文档命名为test11.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Xpath</title>
</head>
<body><ol><li class="Ra01"><name class = 'Bunny01'>Huang</name><age>8</age><food>carrot</food></li><li class="Ra01"><name class = 'Bunny02'>Bai</name><age>10</age><food>celery</food></li><li class="Ra02"><name class = 'Bunny03'>Jack</name><age>20</age><food>cucumber</food></li><li class="Ra03"><name class = 'Bunny03'>Tim</name><age>30</age><food>straw</food></li></ol><div class='description'>      <p>Bunny like to eat ....<a href="http://www.bunny.com/">Anything</a></p></div><div class='advertising'>      <p>welcome to buy our product ....<a href="http://www.bunnyproduct.com/">Perfact!</a></p></div>
</body>
</html>

对于上面的html文件,我们写一个Xpath表达式(定位步缩写形式):

/child::html/child::body/child::div[position()=2]/child::p/child::text()缩写:/html/body/div[2]/p/text()

第一个定位步为:

Document节点(即,根节点)

第二个定位步为:

child::html

由于HTML文档只有一个名为html的根标记,所以Document节点使用该定位步寻找出的节点集中只有一个名字是html的Element节点。

第三个定位步为:

child::body

Xpath在第2定位步后寻找出的节点使用第3定位步寻找出的节点集中只有一个名字是body的Element节点。

第四定位步为:

child::div[position()=2]

Xpath在第3定位步后寻找出的节点使用第4定位步寻找Element节点,则Xpath路径找出的节点集中只有1个名字是div的Element节点(对应着第2个div标记)。

第五定位步为:

child::p

Xpath在第4定位步后寻找出的节点使用第5定位步寻找出的节点集中只有一个名字是p的Element节点。

第六定位步:

child::text()

Xpath在第5定位步后寻找出的节点使用第6定位步寻找Text节点,则Xpath路径找出的节点集中有1个Text节点,这个Text节点名字是#text,包含的文本内容为welcome to buy our product ....

寻找特殊位置的节点

在谓词中使用position()和last()函数可以寻找指定位置上的节点。

我觉得这里直接上例子会理解的比较快,所以,开始敲代码吧!

用我们刚才的test11.html文件为例,在python中进行匹配:

from lxml import etreewith open('test11.html', 'rb') as f:html = f.read().decode('utf-8')#print(html)
parse_html = etree.HTML(html)my_xpath = '/html/body/ol/li[position() = 2]/name/text()'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)my_xpath = '/html/body/ol/li[last()]/name/text()'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)my_xpath = '/html/body/ol/li[last()-1]/name/text()'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)my_xpath = '/html/body/ol/li[position() >= 3 and position() <= 4]/name/text()'
data_list = parse_html.xpath(my_xpath)
print(data_list)

Sublime输出:

['Bai']
---------------
['Tim']
---------------
['Jack']
---------------
['Jack', 'Tim']
[Finished in 0.6s]

Great!!!

寻找有特殊属性的节点

在谓语中使用attribute轴或者@寻找具有特定属性或属性值的节点。

  • 寻找具有指定属性和属性值的节点

如果要寻找具有指定属性的节点,可以在谓词中使用:

attribute::属性名1 逻辑关系符 attribute::属性名2 ... attribute::属性名n

如果要寻找具有指定属性和属性值的节点,可以在谓词中使用:

attribute::属性名1 大小关系符 '值' 逻辑关系符...attribute::属性名n 大小关系符 '值'

还是用我们刚才的test11.html文件为例,在python中进行匹配:

from lxml import etreewith open('test11.html', 'rb') as f:html = f.read().decode('utf-8')#print(html)
parse_html = etree.HTML(html)my_xpath = '/html/body/ol/li[@class="Ra02"]/name/text()'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)my_xpath = '/html/body/div//*[@href]/@href'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)

Sublime输出:

['Jack']
---------------
['http://www.bunny.com/', 'http://www.bunnyproduct.com/']
---------------
[Finished in 0.4s]
  • 使用contains()函数

如果希望寻找具有指定属性,并且属性值中包含有指定字符串的节点时,可以在谓词中使用contains()函数,格式为:

contains(attribute::属性名, '特定字符串')

再来个例子:

from lxml import etreewith open('test11.html', 'rb') as f:html = f.read().decode('utf-8')#print(html)
parse_html = etree.HTML(html)my_xpath = '/html/body/ol/li[contains(@class, "Ra")]/name/text()'
data_list = parse_html.xpath(my_xpath)
print(data_list)

Sublime输出:

['Huang', 'Bai', 'Jack', 'Tim']
[Finished in 0.4s]

寻找有特殊关系节点的节点

???为啥感觉读起来有点绕口

  • 寻找有特殊关系节点的节点

如果要寻找有特殊关系节点的节点,但对该特殊关系节点所包含的内容没有特殊要求,可以在谓词中使用:

轴::节点名称1 逻辑关系符 轴::节点名称2 ... 轴::节点名称n

如果要寻找有特殊关系节点的节点,对该特殊关系节点所包含的内容有特殊要求,可以在谓词中使用:

轴::节点名称1 大小关系 '值' 逻辑关系符...轴::节点名称n 大小关系 '值'

再来个例子:

from lxml import etreewith open('test11.html', 'rb') as f:html = f.read().decode('utf-8')#print(html)
parse_html = etree.HTML(html)my_xpath = '/html/body/*[descendant::p and descendant::a]/p/a/text()'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)my_xpath = '/html/body/ol/li[age=20]/name/text()'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)

Sublime输出:

['Anything', 'Perfact!']
---------------
['Jack']
---------------
[Finished in 0.6s]
  • 使用contains()函数

如果要寻找有特殊关系节点的节点,且特殊关系节点包含的文本需要含有指定的字符串时,可以使用contains()函数,格式是:

contains(轴::节点名称, '特定字符串')

来个例子:

from lxml import etreewith open('test11.html', 'rb') as f:html = f.read().decode('utf-8')#print(html)
parse_html = etree.HTML(html)my_xpath = '/html/body//li[contains(age, "0")]/name/text()'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)

Sublime输出:

['Bai', 'Jack', 'Tim']
---------------
[Finished in 0.6s]

使用谓词嵌套寻找节点

谓词的作用是给出节点需要满足的进一步条件,因此允许谓词继续使用谓词。

比如,对于嵌套谓词:

[div[descendant::a="Anything"]]

满足该谓词条件的节点必须有名字是div的子节点,且div节点中必须包含文本内容为"Anything"的a子孙节点。


如有错误,请求指出。

利用python爬虫(part9)--Xpath与谓词の爱相关推荐

  1. 利用python爬虫(part10)--Xpath节点集与函数

    学习笔记 编辑器:Sublime 注意:这里的理论部分是关于XML文档的,但是介于HTML和XML的相似性,大家可以自行做类比,有的地方我也会用HTML和XML做类比. 上一篇:Xpath与谓词的爱 ...

  2. 利用python爬虫(part8)--Xpath路径表达式

    学习笔记 编辑器:Sublime 注意:这里的理论部分是关于XML文档的,但是介于HTML和XML的相似性,大家可以自行做类比,有的地方我也会用HTML和XML做类比. 上一篇:初识Xpath之Nod ...

  3. python xpath语法-Python爬虫之XPath语法和lxml库的用法

    本来打算写的标题是XPath语法,但是想了一下Python中的解析库lxml,使用的是Xpath语法,同样也是效率比较高的解析方法,所以就写成了XPath语法和lxml库的用法 安装 为什么要用这个库 ...

  4. 手把手教你利用 python 爬虫分析基金、股票

    手把手教你利用 python 爬虫分析基金.股票 文章目录 手把手教你利用 python 爬虫分析基金.股票 第一步:基金数据爬取 第二步:股票增持计算 第三步:好股基金选取 桌面程序 exe 从前大 ...

  5. python汇率转换_利用Python中的Xpath实现一个在线汇率转换器

    前言 在之前的语法里面,我们记得有一个初识Python之汇率转换篇,在那个程序里面我们发现可以运用一些基础的语法写一个汇率计算,但是学到后面的小伙伴就会发现这个小程序有一定的弊端. 首先,它不可以实时 ...

  6. 利用python爬虫与数据分析,打造最强玩法,轻松成为大神级玩家!

    前言: 最近迷上了一款游戏,但是作为一名程序员的我是不可能只玩游戏的,我必须把它的官网数据采集下来! 环境: windows python3.6.5 模块: requests jsonpath pyg ...

  7. Python爬虫:Xpath语法笔记

    Python爬虫:Xpath语法笔记 一.选取节点 常用的路劲表达式: 表达式 描述 实例   nodename 选取nodename节点的所有子节点 xpath('//div') 选取了div节点的 ...

  8. python爬虫爬取音乐_利用python爬虫实现爬取网易云音乐热歌榜

    利用python爬虫实现爬取网易云音乐热歌榜 发布时间:2020-11-09 16:12:28 来源:亿速云 阅读:102 作者:Leah 本篇文章给大家分享的是有关利用python爬虫实现爬取网易云 ...

  9. 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)...

    [爬虫]利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2) 第一篇( http://blog.itpub.net/26736162/viewspace-22865 ...

最新文章

  1. 李飞飞对话顶级神经科学家纽瑟姆:大脑也做「微积分」,最高效GPU依然很浪费...
  2. 汇编: dosbox命令
  3. 加入依赖后刷新_和平精英海岛图神秘野区加入!地图没显示 刷新点在这儿
  4. 软件测试中英文词汇汇总
  5. 【OpenGL4.0】GLSL-使用Uniform Block实现着色器的数据共享
  6. MySQL性能调优my.cnf详解
  7. SurfaceView实例
  8. 栅栏密码加密/解密【传统型】在线工具
  9. 紫色金融仿给你花网贷平台源码|借贷系统|带计息费用
  10. VisionPro实现测量工件内圆尺寸
  11. mean函数 median函数【Matlab】
  12. idea启动报错‘否则 JavaFX 应用程序类必须扩展javafx.application.Application’
  13. AntV G2 Tooltip
  14. 和面试官对线HashMap
  15. python中多行注释可以嵌套单行注释吗_Python单行注释与多行注释
  16. 全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题]
  17. bootstrap--表格(table的各种样式)
  18. 图像匹配—NCC算法,即归一化互相关匹配
  19. DMIPS, TOPS, FLOPS, FLOPs, GMACs, FMA
  20. SciTE Script Editor 解决中文乱码

热门文章

  1. cache 简单理解
  2. 机器学习:正负样本数据量不平衡处理方法
  3. 神经网络优化:指数衰减计算平均值(滑动平均)
  4. 开课了撒贝宁超级计算机,从儿时的不自信,到现在的北大高材生,看看撒贝宁的开挂人生...
  5. python怎么设置颜色深浅变化_python之深浅拷贝
  6. 小程序引用icon图标(入门)
  7. 同步和原子性---多线程学习笔记(四)
  8. pt-online-schema-change 在线修改表结构
  9. MyBatis(三)
  10. 人民日报“权威认证”吃鸡装备哪家强,不服来辩!