XPath轴以节点关系为定位路径,通过节点间的关系选取节点或节点集,XPath轴可以使用到路径表达式中。
XPath轴定位语法如下:
轴名称::节点名称[谓词]
其中轴名称是XPath定义的轴的名称,节点名称是XPath节点的名称,谓词是可选的。
在后面的案例中使用下面给出的HTML内容,执行案例程序时,需要把下面的HTML内容保存到本地,文件名是sample.html,编码格式是utf-8。
<html> <head> <title>落花生与济南的冬天</title> </head> <body> <div id="id_title"> <a href="#article1" target="_self">落花生</a> <a href="#article2" target="_self">济南的冬天</a> </div> <a name="article1"></a> <h1>落花生</h1> <h5>许地山</h5> <hr> <p> 我们家的后园有半亩空地。母亲说:“让它荒着怪可惜的,你们那么爱吃花生,就开辟出来种花生吧。”我们姐弟几个都很高兴,买种,翻地,播种,浇水,没过几个月,居然收获了。 </p> <p> 母亲说:“今晚我们过一个收获节,请你们的父亲也来尝尝我们的新花生,好不好?”母亲把花生做成了好几样食品,还咐附就在后园的茅亭里过这个节。 </p> <a name="article2"></a> <h1>济南的冬天</h1> <h5>老舍</h5> <hr> <p style="font-weight:bolder"> 对于一个在北平住惯的人,像我,冬天要是不刮风,便觉得是奇迹;济南的冬天是没有风声的。对于一个刚由伦敦回来的人,像我,冬天要能看得见日光,便觉得是怪事;济南的冬天是响晴的。自然,在热带的地方,日光是永远那么毒,响亮的天气,反有点叫人害怕。可是,在北中国的冬天,而能有温晴的天气,济南真得算个宝地。 </p> 设若单单是有阳光,那也算不了出奇。请闭上眼睛想:一个老城,有山有水,全在天底下晒着阳光,暖和安适地睡着,只等春风来把它们唤醒,这是不是个理想的境界? <p> </div> </boyd> </html>
XPath定义的轴如下表所示(表中的实例取自sample.html):

案例1:选取属性name值为article1a的a节点之后的所有兄弟节点
#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
#使用r模式打开文件,编码方式为utf-8
fp = open(filename,"r",encoding='utf-8')
content = fp.read()
#关闭文件对象
fp.close()
# 读取HTML文档内容,返回选择器
selector = etree.HTML(content)
#选取属性name值为article1a的a节点之后的所有兄弟节点
select = selector.xpath("/html/body/a[@name='article1']/following-sibling::*")
print(select)
except IOError:
print("文件打开失败,%s文件不存在" % filename)程序执行结果如下所示:
[
<Element h1 at 0x1daf6ee9480>,
<Element h5 at 0x1daf6ee94c0>,
<Element hr at 0x1daf6ee9500>,
<Element p at 0x1daf6ee9540>,
<Element p at 0x1daf6ee9580>,
<Element h1 at 0x1daf6ee9600>,
<Element h5 at 0x1daf6ee9640>,
<Element hr at 0x1daf6ee9680>,
<Element p at 0x1daf6ee96c0>,
<Element p at 0x1daf6ee95c0>
]
案例2:选取属性id值为id_title的div节点所有的子节点
#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
#使用r模式打开文件,编码方式为utf-8
fp = open(filename,"r",encoding='utf-8')
content = fp.read()
#关闭文件对象
fp.close()
# 读取HTML文档内容,返回选择器
selector = etree.HTML(content)
#选取属性id值为id_title的div节点所有的子节点
select = selector.xpath("/html/body/div[@id='id_title']/child::*")
print(select)
except IOError:
print("文件打开失败,%s文件不存在" % filename)程序执行结果如下所示:
[
<Element a at 0x1767096a5c0>,
<Element a at 0x1767096a600>
]
案例3:选取html后代所有节点且名称为title的节点
#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
#使用r模式打开文件,编码方式为utf-8
fp = open(filename,"r",encoding='utf-8')
content = fp.read()
#关闭文件对象
fp.close()
# 读取HTML文档内容,返回选择器
selector = etree.HTML(content)
#选取html后代所有节点且名称为title的节点
select = selector.xpath("/html/descendant::title")
print(select)
except IOError:print("文件打开失败,%s文件不存在" % filename)
程序执行结果如下所示:
[
<Element title at 0x2870821b400>