当前位置 : 主页 > 编程语言 > python >

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

来源:互联网 收集:自由互联 发布时间:2022-06-15
学习笔记 编辑器:Sublime 注意:这里的理论部分是关于XML文档的,但是介于HTML和XML的相似性,大家可以自行做类比,有的地方我也会用HTML和XML做类比。 上一篇:Xpath与谓词的爱 文章目

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

上一篇:Xpath与谓词的爱



文章目录

  • ​​节点集上使用谓词​​
  • ​​节点集上的并运算​​
  • ​​节点集与函数​​

节点集上使用谓词

Xpath允许在Xpath绝对路径最后寻找出的节点集上使用谓词,作用是从当前节点集中筛选、过滤出所需要的节点,使用格式为:

(绝对路径)[谓词]

针对下面的HTML文档(将这个文档命名为test12.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>
</body>
</html>

python代码:

from lxml import etree

with 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 etree

with 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 etree

with 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文档,如下:

<!DOCTYPE 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 etree

with 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系列暂时更完。

上一篇:利用python爬虫(part12)--随机获取UserAgent
下一篇:没有了
网友评论