简介
XPth,全称XML Path Language,即XML路径语言。可以快速便捷的从XML文档中查找信息的语言,同样适用于HTML文档。
XPth常用规则
路径表达式
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选择孙节点 |
. | 选取当前节点 |
.. | 选取当前节点的父级节点 |
@ | 选取属性 |
/text() | 获取标签对象文本 |
通配符匹配
通配符 | 描述 |
---|---|
* | 匹配任何元素节点 |
匹配任何属性节点 | |
node() | 匹配任何类型的节点 |
综合示例
# -*- coding:utf8 -*-from lxml import etreetext = """第一个div测试标签测试 P 标签
第二个div测试标签 测试 span 标签"""html = etree.HTML(text) # 构造 XPth 解析对象# html = etree.parse('./test.html',etree.HTMLParser()) # 读取本地 HTML 方法r = etree.tostring(html).decode('utf8')# etree.tostring() 方法将HTML标签代码修正,补全了示例中未闭合的标签和加入了标签# 默认显示为bytes类型,后边跟decode转换为utf8格式print("修正后的HTML信息:",r)print("################# 路径获取指定类型节点 ########################")print("获取子级标签对象:" ,html.xpath('/html'))print("获取孙级标签对象:" ,html.xpath('//div'))print("获取指定级别所有标签对象:" ,html.xpath('//*'))print("匹配任何类型的节点:" ,html.xpath('//node()'))print("################## 路径获取节点[按序选择] ######################")print("下标取第一个对象:",html.xpath('//div')[0])print("谓语参数取最后一个对象:",html.xpath('//div[last()]'))print("谓语参数取倒数第二个对象:",html.xpath('//div[last()-1]'))print("################### 获取节点标签对象文本 #######################")print("获取某标签对象文本:" ,html.xpath('//span/text()'))print("####################### 属性获取节点 ###########################")print("匹配所有带属性的标签",html.xpath('//div[@*]//text()'))print("属性获取标签:" ,html.xpath('//div[@class]/text()'))print("属性含值获取标签:" ,html.xpath('//div[@class="test1"]/text()'))print("多属性包含获取标签",html.xpath('//div[contains(@class,"test2")]//text()'))
XPath 轴
轴名称 | 描述 |
---|---|
ancestor | 选取当前节点的所有先辈(父、祖父等) |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 |
attribute | 选取当前节点的所有属性 |
child | 选取当前节点的所有子元素 |
descendant | 选取当前节点的所有后代元素(子、孙等) |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身 |
following | 选取文档中当前节点的结束标签之后的所有节点 |
namespace | 选取当前节点的所有命名空间节点 |
parent | 选取当前节点的父节点 |
preceding | 选取文档中当前节点的开始标签之前的所有节点 |
preceding-sibling | 选取当前节点之前的所有同级节点 |
self | 选取当前节点 |
绝对位置路径:
/step/step/...
相对位置路径:
step/step/...
每个步均根据当前节点集之中的节点来进行计算。
步(step)包括:
- 轴(axis)定义所选节点与当前节点之间的树关系
- 节点测试(node-test)识别某个轴内部的节点
- 零个或者更多谓语(predicate)更深入地提炼所选的节点集
步的语法:
轴名称::节点测试[谓语]
示例
例子 | 结果 |
---|---|
child::book | 选取所有属于当前节点的子元素的 book 节点。 |
attribute::lang | 选取当前节点的 lang 属性。 |
child::* | 选取当前节点的所有子元素。 |
attribute::* | 选取当前节点的所有属性。 |
child::text() | 选取当前节点的所有文本子节点。 |
child::node() | 选取当前节点的所有子节点。 |
descendant::book | 选取当前节点的所有 book 后代。 |
ancestor::book | 选择当前节点的所有 book 先辈。 |
ancestor-or-self::book | 选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点) |
child::*/child::price | 选取当前节点的所有 price 孙节点。 |