学习笔记 编辑器:Sublime 注意:这里的理论部分是关于XML文档的,但是介于HTML和XML的相似性,大家可以自行做类比,有的地方我也会用HTML和XML做类比。 上一篇:Xpath与谓词的爱 文章目
学习笔记
编辑器:Sublime
注意:这里的理论部分是关于XML文档的,但是介于HTML和XML的相似性,大家可以自行做类比,有的地方我也会用HTML和XML做类比。
上一篇:Xpath与谓词的爱
文章目录
- 节点集上使用谓词
- 节点集上的并运算
- 节点集与函数
节点集上使用谓词
Xpath允许在Xpath绝对路径最后寻找出的节点集上使用谓词,作用是从当前节点集中筛选、过滤出所需要的节点,使用格式为:
(绝对路径)[谓词]针对下面的HTML文档(将这个文档命名为test12.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>
</body>
</html>
python代码:
from lxml import etreewith open('test12.html', 'rb') as f:
html = f.read().decode('utf-8')
#print(html)
parse_html = etree.HTML(html)
my_xpath = '(/html//li)[1]'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)
my_xpath = '/html//li[1]'
data_list = parse_html.xpath(my_xpath)
print(data_list)
Sublime输出:
[<Element li at 0xe2588b4ec8>]---------------
[<Element li at 0xe2588b4ec8>]
[Finished in 0.5s]
需要注意的是,python代码中两种Xpath表达式得到的结果虽然相同,但是寻找节点的过程是不同的。
节点集上的并运算
Xpath允许将多个Xpath表达式寻找出的节点集用|进行集合的并运算,所得到的的节点集中的节点按照节点在XML中的对应的标记或文本出现的先后顺序排列。
来个例子吧,用上面的test12.html为例:
from lxml import etreewith open('test12.html', 'rb') as f:
html = f.read().decode('utf-8')
#print(html)
parse_html = etree.HTML(html)
my_xpath = '/html//li[@class="Ra01"]/name/text() | /html//li[@class="Ra01"]/age/text()'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)
Sublime输出:
['Huang', '8', 'Bai', '10']---------------
[Finished in 0.4s]
节点集与函数
为例计算和节点集有关的数据,Xpath语言给出了几个作用于节点集上的函数。
- count(节点集)
count()函数将返回参数指定的节点集中的节点的个数。
举个例子,还是用上面的test12.html文件举例:
from lxml import etreewith open('test12.html', 'rb') as f:
html = f.read().decode('utf-8')
#print(html)
parse_html = etree.HTML(html)
my_xpath = 'count(/html//li[@class="Ra01"]/name)'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)
my_xpath = 'count(/html//li[contains(food, "c")])'
data_list = parse_html.xpath(my_xpath)
print(data_list)
Sublime输出:
2.0---------------
3.0
[Finished in 0.5s]
- sun(节点集)
sum()函数将节点集中的节点所包含的文本转换为数字,并返回它们的和,如果节点集中的某个节点所包含的文本不能转换为数字,则sum()会返回NaN
这里为了举例,我们新构建一个HTML文档,如下:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Xpath</title>
</head>
<body>5
<p>
3
<ol>
<li>1</li>
<li>2</li>
</ol>
</p>
<p>
4
</p>
</body>
</html>
python代码:
from lxml import etreewith open('test13.html', 'rb') as f:
html = f.read().decode('utf-8')
#print(html)
parse_html = etree.HTML(html)
my_xpath = 'sum(/html//li/text())'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)
my_xpath = 'sum(/html//li)'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)
my_xpath = 'sum(/html/body/p)'
data_list = parse_html.xpath(my_xpath)
print(data_list)
print('-'*15)
my_xpath = 'sum(/html/body)'
data_list = parse_html.xpath(my_xpath)
print(data_list)
Sublime输出:
3.0---------------
3.0
---------------
7.0
---------------
nan
[Finished in 0.4s]
由结果,我们可以得出很多结论,请自行领会(因为博主不知道自己总结的对不对,哈哈哈)。
如有错误,请求指出。
Xpath系列暂时更完。