XPath使用

  • /当前节点的直接子节点
  • //当前节点选取子孙节点
  • .当前节点
  • ..当前节点的父节点
  • @选取属性
  • nodeName选取节点的所有子节点

属性多值匹配

1
2
3
4
5
6
7
from lxml import etree
text = '''
<li class="li li-first" name="item"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
# 采用contains函数 意思为class属性中包含li,并且name属性为item的对象
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')

按序匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from lxml import etree

text = '''
<div>
<ul>
<li class="item-0" name="yyy"><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()')
result = html.xpath('//li[last()]/a/text()')
# 位置小于3的li节点,也就是1、2节点
result = html.xpath('//li[position()<3]/a/text()')
# 倒数第三个li节点
result = html.xpath('//li[last()-2]/a/text()')

节点轴匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from lxml import etree

html = etree.HTML(text)
# 返回第一个li节点的所有祖先节点
result = html.xpath('//li[1]/ancestor::*')
# 返回第一个li节点的div祖先节点
result = html.xpath('//li[1]/ancestor::div')
# 返回第一个li节点的所有属性值 ['item-0', 'yyy']
result = html.xpath('//li[1]/attribute::*')
# 返回第一个li节点的所有直接子节点中href属性为link1.html的节点
result = html.xpath('//li[1]/child::a[@href="link1.html"]')
# 返回第一个li节点的所有子孙节点中的span节点,也就是a节点不返回
result = html.xpath('//li[1]/descendant::span')
# 返回第一个li节点之后的所有节点 4个<li> 4个<a>
result = html.xpath('//li[1]/following::*')
# 返回第一个li节点后的所有同级节点 4个<li>
result = html.xpath('//li[1]/following-sibling::*')
赏个🍗吧
0%