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

网友投稿 396 2022-08-31


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

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

上一篇:Xpath与谓词的爱

文章目录

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

节点集上使用谓词

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

(绝对路径)[谓词]

针对下面的HTML文档(将这个文档命名为test12.html),我们来写一段代码,直观感受一下这个知识点(也可能啥也感受不到??):

Xpath

  1. Huang 8 carrot
  2. Bai 10 celery
  3. Jack 20 cucumber
  4. Tim 30 straw

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输出:

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

Xpath5

3

  1. 1
  2. 2

4

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:利用python爬虫(part12)--随机获取UserAgent
下一篇:springboot创建文件夹失败的解决
相关文章

 发表评论

暂时没有评论,来抢沙发吧~