python|python爬虫学习27

python爬虫学习27 今天继续学习Xpath
上接上篇

目录

    • python爬虫学习27
      • 五、Xpath 的使用之二
        • 5-5 子节点
        • 5-6 父节点
        • 5-7 属性匹配

五、Xpath 的使用之二
不熟悉的时候先把规则附上:
python|python爬虫学习27
文章图片

5-5 子节点 通过/或者 //即可查找元素的子节点。
from lxml import etreehtml = etree.parse('./text.html', etree.HTMLParser()) # 检索所有li节点下的a节点 result = html.xpath('//li/a') print(result)

运行结果:
python|python爬虫学习27
文章图片

当然上例是寻找特定节点下的直接子节点,若要找寻某个节点内的所有子节点:
from lxml import etreehtml = etree.parse('./text.html', etree.HTMLParser()) result = html.xpath('//ul//a') print(result)

运行结果:
python|python爬虫学习27
文章图片

当然对于我们所选取html来说结果是一样的,当时上述两种方式所表述的意义是完全不同的。
接下来,请大家思考,如果我们把Xpath写成下面这样,会匹配到什么结果?
'//ul/a'

from lxml import etreehtml = etree.parse('./text.html', etree.HTMLParser()) result = html.xpath('//ul/a') print(result)

对于Xpath语言来说一个/代表选取ul节点下的直接节点a,那么结果是当然的:
python|python爬虫学习27
文章图片

5-6 父节点 知道了如何查询子节点和子孙节点,那如何查询父节点呢?
这次换了一段html,比如我们想查找这里的div节点
python|python爬虫学习27
文章图片

假如选中class属性为baikeLogo的h1节点,我们想要得到它的父节点的id属性,可以这样操作:
from lxml import etreehtml = etree.parse('./python.html', etree.HTMLParser()) result = html.xpath('//h1[@class="baikeLogo"]/../@id') print(result)

运行结果:
python|python爬虫学习27
文章图片

也可以通过parent::获取父节点:
# parent:: from lxml import etreehtml = etree.parse('./python.html', etree.HTMLParser()) result = html.xpath('//h1[@class="baikeLogo"]/parent::*/@id') print(result)

运行结果:
python|python爬虫学习27
文章图片

5-7 属性匹配 想要匹配特定属性的节点,就要用到@,在之前的案例中我们已经见到过他了:
比如,我们想匹配这里的所有class属性为li的li节点:
python|python爬虫学习27
文章图片

# 属性匹配from lxml import etreehtml = etree.parse('./python.html', etree.HTMLParser()) result = html.xpath('//li[@class="li"]') print(result)

运行结果:从截图中我们可以看到符合的结果应该有3个,运行结果里也有三个
python|python爬虫学习27
文章图片

那么问题来了,给完们返回的这仨东西是不是我们想要的那三个呢?
【python|python爬虫学习27】今日就到这了,卖个关子先。。。

    推荐阅读