1. 简介
XPath即XML Path Language,是一门在 XML 文档中查找信息的语言。
2. XPath 语法
2.1 选择结点
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点。 |
@ | 选取属性 |
示例:
作用 | 路径表达式 | 结果 |
---|---|---|
所有结点 | //* | 所有结点 |
子节点 | //li/a | li结点所有直接a子节点 |
子孙结点 | //li//a | li结点所有子孙a结点 |
父节点+属性匹配 | //li[@href=“link”]/…/@class | 选取href属性为link的li结点,再选取的父节点的class属性 |
属性匹配 | //li[@class] //li[@class=“item”] | 选取拥有class属性的li结点 选取结点class属性为item的li结点 |
属性多值匹配 | <li class="li li-first"> ...</li> //li[contains(@class,“li”)] | 选取class属性包含li的li结点 |
多属性匹配 | <li class="li li-first" name="item"> ...</li> //li[contains(@class,“li”) and @name=“item”] | 选取class属性包含li,并且name属性为item的li结点 |
2.2 选择排序
在选择时可能同时匹配了多个结点,选择其中某个节点。
路径表达式 | 结果 |
---|---|
//li[1] | 选取第一个li结点,不是从0开始 |
//li[last()] | 选取最后一个li结点 |
//li[last()-1] | 选取倒数第二个li结点 |
//li[position()< 3] | 选取前两个li结点 |
//li[attr>35] | 选取attr属性大与35的li结点 |
2.3 节点轴选择
轴名称 | 结果 |
---|---|
self | 选取当前节点 |
parent | 选取当前节点的父节点 |
ancestor | 选取当前节点的所有先辈(父、祖父等) |
ancestor-or-self | 选取当前节点以及当前节点本身 |
child | 选取当前节点的所有直接子元素 |
descendant | 选取当前节点的所有后代元素(子、孙等) |
descendant-or-self | 选取当前节点的所有后代元素以及当前节点本身 |
following | 选取文档中当前节点的结束标签之后的所有节点 |
preceding | 选取文档中当前节点的开始标签之前的所有节点 |
preceding-sibling | 选取当前节点之前的所有同级节点 |
attribute | 选取当前节点的所有属性 |
namespace | 选取当前节点的所有命名空间节点 |
示例:
路径表达式 | 结果 |
---|---|
//li[1]/ancestor:: * | 选取li[1]的所有祖先节点 |
//li[1]/ancestor::div | 选取li[1]的div祖先节点 |
//li[1]/child::a[@href=“link”] | 选取i[1]的属性lhref为link的直接子节点 |
//li[1]/following:: *[2] | 选取li[1]的第二个后继结点 |
2.4 类型
from lxml import etree
html = etree.HTML(text) #type(html):lxml.etree._Element
result=html.xpath('//li') #type(result):list;
#type(result[0]):lxml.etree._Element
print(result[0]) #<Element li at 0x1b4335eafc8>
result=html.xpath('//li[1]') #type(result):list
print(result) #[<Element li at 0x1b4335eafc8>],与上个相同
result=html.xpath('//li/@class') #type(result):list
result=html.xpath('//li[1]/child::*')#type: list
"""
text()的用法:
<li class="item-5"><a href="0.html">item 0</a>
</li>
"""
result=html.xpath('//li[1]/text()')
print(result) #['\t\n'],'/'为直接子节点,只有</a>与</li>之间的\t\n
result=html.xpath('//li[1]//text()')
print(result) #['item 0', '\t\n'],'//'为所有子孙结点,也包含了a节点的内容
2.5 XPath 运算符
常用有:
or | and | mod | |:计算连个节点集 | + | - | * | div |
---|---|---|---|---|---|---|---|
= | != | < | <= | > | >= |