xpath语法简介
xpath称之为xml路径语言,是一种基于xml的树状结构,来提取特定元素的语言。在python中,最常见的是通过lxml模块来使用xpath, 基本用法如下
>>> from lxml import etree
>>> html = etree.parse("K00001.html", etree.HTMLParser())
>>> html.xpath('/html')
在xml的树状结构中,根节点用/表示,所有的元素都可以作为子节点存在。和linux文件树中相对和绝对定位类似,在xpath中,也有两种定位的写法
1. 绝对定位,用/表示,选取路径树中直接相连的子节点
2. 相对定位,用//表示,表示路径树中所有的子孙节点
同时,一个点号表示当前节点,两个点号表示当前节点父节点的简写方式在xpath中也是适用的。按照以上原则,就可以快速的写出最基础的路径表达式了,以下三种写法是等价的
# 从根节点开始,依次指定路径
>>> html.xpath('/html/head/title')
[<Element title at 0x7f3795bd1d48>]
# 利用//符号,得到属于html标签孙节点的title标签
>>> html.xpath('/html//title')
[<Element title at 0x7f3795bd1d48>]
# 直接用//符号,捕获title标签
>>> html.xpath('//title')
[<Element title at 0x7f3795bd1d48>]
在基础路径的基础上,我们可以通过一些筛选手段进一步对子节点进行限制。xpath的返回结果为一个列表,所以通过方括号运算符来提取子集,经典的用法有以下两种
1. 利用位置筛选
对于多个元素,通过数字下标来选取节点,用法如下
>>> html.xpath('//link')
[<Element link at 0x7f3793a6be88>, <Element link at 0x7f3795b960c8>, <Element link at 0x7f3793a6bf88>, <Element link at 0x7f3793a6b908>]
# 用数字下标提取子集
>>> html.xpath('//link[1]')
[<Element link at 0x7f3793a6be88>]
# 用last函数提取最后一个元素
>>> html.xpath('//link[last()]')
[<Element link at 0x7f3793a6b908>]
# position函数比整数下标加1
>>> html.xpath('//link[position() < 3]')
[<Element link at 0x7f3795b960c8>, <Element link at 0x7f3793a6b9c8>]
2. 利用属性筛选
可以通过指定属性或者属性的值来筛选节点,用法如下
# 筛选包含特定属性的点
>>> html.xpath('//link[@media]')
[<Element link at 0x7f3793a6b9c8>]
# 根据属性值进行筛选
>>> html.xpath('//link[@media = "only"]')
# 逻辑操作,根据多个属性的值进行筛选
>>> html.xpath('//link[@media = "only" and @herf="#"]')
当我们选取出符合条件的节点之后,进一步需要取出该节点的额外信息,通常是包含的文字或者属性值,用法如下
# 获取文本
>>> html.xpath('//title/text()')
# 获取属性值
>>> html.xpath('//a/@href')
赞 (0)