今天继续学习Xpath
上接上篇
不熟悉的时候先把规则附上:
通过/或者 //即可查找元素的子节点。
from lxml import etree
html = etree.parse('./text.html', etree.HTMLParser())
# 检索所有li节点下的a节点
result = html.xpath('//li/a')
print(result)
运行结果:
当然上例是寻找特定节点下的直接子节点,若要找寻某个节点内的所有子节点:
from lxml import etree
html = etree.parse('./text.html', etree.HTMLParser())
result = html.xpath('//ul//a')
print(result)
运行结果:
当然对于我们所选取html来说结果是一样的,当时上述两种方式所表述的意义是完全不同的。
接下来,请大家思考,如果我们把Xpath写成下面这样,会匹配到什么结果?
'//ul/a'
from lxml import etree
html = etree.parse('./text.html', etree.HTMLParser())
result = html.xpath('//ul/a')
print(result)
对于Xpath语言来说一个/代表选取ul节点下的直接节点a,那么结果是当然的:
知道了如何查询子节点和子孙节点,那如何查询父节点呢?
这次换了一段html,比如我们想查找这里的div节点
假如选中class属性为baikeLogo的h1节点,我们想要得到它的父节点的id属性,可以这样操作:
from lxml import etree
html = etree.parse('./python.html', etree.HTMLParser())
result = html.xpath('//h1[@class="baikeLogo"]/../@id')
print(result)
运行结果:
也可以通过parent::获取父节点:
# parent::
from lxml import etree
html = etree.parse('./python.html', etree.HTMLParser())
result = html.xpath('//h1[@class="baikeLogo"]/parent::*/@id')
print(result)
运行结果:
想要匹配特定属性的节点,就要用到@,在之前的案例中我们已经见到过他了:
比如,我们想匹配这里的所有class属性为li的li节点:
# 属性匹配
from lxml import etree
html = etree.parse('./python.html', etree.HTMLParser())
result = html.xpath('//li[@class="li"]')
print(result)
运行结果:从截图中我们可以看到符合的结果应该有3个,运行结果里也有三个
那么问题来了,给完们返回的这仨东西是不是我们想要的那三个呢?
今日就到这了,卖个关子先。。。