1.属性获取
例如,我们想获取所有li节点下所有a节点的href属性:
from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//li/a/@href')
print(result)
这里我们通过@href即可获取节点的href属性。此处和属性匹配的方法并不同,属性匹配是中括号加属性名和值来限定某个属性,如[@href="link1.html"],而此处的@href指的是获取节点的某个顺序。
2.属性多值匹配
有时某些节点的某个属性可能有多个值,如:
from lxml import etree
text='''
<li class="li li-first"><a href="link.html">first item</a></li>
'''
html=etree.HTML(text)
result=html.xpath('//li[contains(@class, "li")]/a/text()')
print(result)
这样通过contains()方法,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以完成匹配了。
3.多属性匹配
另外我们可能还遇到一种情况,那就是根据多个属性一个节点,这时就需要同时匹配多个属性。此时可以使用运算符and来链接:
from lxml import etree
text='''
<li class="li li-first"><a href="link.html">first item</a></li>
'''
html=etree.HTML(text)
result=html.xpath('//li[contains(@class, "li") amd @name="item"]/a/text()')
print(result)
这里的li节点又增加了一个属性name。要确定这个节点,需要同时根据class和name属性来选择,一个条件是class属性里面包含li字符串,另一个条件是name属性为item字符串,二者相连后置于中括号内进行条件筛选。
4.按序选择
当我们在选择的时候某些属性可能同时匹配多个节点,这时我们可以利用中括号传入索引的方法获取特定次序的节点,如:
from lxml import etree
text='''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
html=etree.HTML(text)
result=html.xpath('//li[1]/a/text()')
print(result)
result=html.xpath('//li[last()]/a/text()')
print(result)
result=html.xpath('//li[position()<3]/a/text()')
print(result)
result=html.xpath('//li[last()-2]/a/text()')
print(result)
5.节点轴选择
XPath提供了很多节点轴选择方法,包括获取子元素、兄弟元素、父元素、祖先元素等,如:
from lxml import etree
text='''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</span></a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
html=etree.HTML(text)
result=html.xpath('//li[1]/ancestor::*')
print(result)
result=html.xpath('//li[1]/ancestor::div')
print(result)
result=html.xpath('//li[1]/attribute::*')
print(result)
result=html.xpath('//li[1]/child::a[@href="link1.html"]')
print(result)
result=html.xpath('//li[1]/descendant::span')
print(result)
result=html.xpath('//li[1]/following::*[2]')
print(result)
result=html.xpath('//li[1]/following-sibling::*')
print(result)
第一次选择时,我们调用了ancestor轴,其后需要跟两个冒号,然后时节点选择器。