xPath方法
- 使用之前先安装好lxml库
pip i lxml - xPath使用路径表达式在XML文档中进行导航
- 可以对本地的html文件进行解析也可以直接对html字符串进行解析
Xpath常用的规则
nodename选取所有的子节点/选取当前节点下的子节点//选取当前节点的子孙节点. 选取当前节点.. 选取当前节点的父节点@选取属性
本地展示

# coding= utf-8from lxml import etreehtml = etree.parse('./index.html',etree.HTMLParser())print(etree.tostring(html))
# coding= utf-8from lxml import etreefp = open('./index.html', 'rb')html = fp.read().decode('utf-8') selector = etree.HTML(html) #etree.HTML(源码) 识别为可被xpath解析的对象print(selector)
- 匹配所有的节点 使用
//*规则匹配 - 匹配所有指定的节点使用
//节点名称 - 匹配所有的子节点将//换成
/ - 获取父节点属性值的方法
../@属性名 - 属性匹配可以使用
@属性名的方法 - 文本获取两种方法
/text() 和 //text(), 区别第一种直接获取文本, 第二种要获取换行时产生的特殊字符 - 属性获取使用
/@href获取 - 获取属性中包含多个值的情况 属性多值匹配
contains()方法 - 多属性匹配, 使用and运算符 和contains方法搭配使用
xPath运算符
- 除号和取余特殊, 其他的都与基本运算符一直
- 除号使用
div 比如8 div 4 - 取余则是
mod 比如1 mod 2 - 还有表示并列和或者的
and 和 or
按序选择

节点轴选择
- 获取当前节点所有子元素的
a节点的href属性值 child::a/@href - 获取当前节点的指定元素的属性值
attribute:: 属性名 - 获取当前节点的所有的子元素
child::* - 获取当前节点 的所有属性的属性值
attribute::* - 获取当前节点所有子节点
child::node() - 获取当前元素所有文本子节点
child::text() - 获取当前元素的所有父辈为li元素的节点(包括当前元素)
ancestor-or-self:: 元素
xPath轴
xPath避坑指南

演示代码
# coding= utf-8from lxml import etree# fp = open('./index.html', 'rb')# html = fp.read().decode('utf-8') #.decode('gbk')# selector = etree.HTML(html) #etree.HTML(源码) 识别为可被xpath解析的对象# print(selector)html = etree.parse('./index.html',etree.HTMLParser())# print(etree.tostring(html).decode('utf-8'))all_node = html.xpath('//*') # 所有节点的获取 //*part_node = html.xpath('//li') # 部分节点 格式://节点名child_node = html.xpath('//li/a') # 匹配子节点parent_node = html.xpath('//a[@href="//mr90.top"]/../@class') # 获取父节点属性值的方法 ../@属性名attrs_node = html.xpath('//a[contains(@class,"a")]/text()') # 获取属性中包含多个值的情况 属性多值匹配 contains()方法# 按序获取first_node = html.xpath('//li[1]/a/text()') # 获取第一个last_node = html.xpath('//li[last()]//text()') # 获取最后一个节点front_node = html.xpath('//li[position()<3]//text()') # 获取前两个节点end_ndoe = html.xpath('//li[last()-2]//text()') # 获取到数第三个节点# 轴节点child_node_z = html.xpath('//li[position()<2]/child::a/@href') # 获取当前节点所有子元素的a节点的href属性值attribute_node = html.xpath('//li[2]//attribute::lang') # 获取当前节点的指定元素的属性值all_child_node = html.xpath('//ul/li[last()-1]//child::*') # 获取当前节点的所有的文本节点all_attrs_node = html.xpath('//li[1]/a/attribute::*') # 获取当前节点 的所有属性的属性值all_child_text_node = html.xpath('//li[1]//child::text()') # 获取当前节点所有文本子节点all_child_node_node = html.xpath('//li[1]/a/child::node()') # 获取当前节点所有子元素ancestor_self = html.xpath('//a[@title="1"]/../ancestor-or-self::li') # 获取当前元素的所有父辈为li元素的节点(包括当前元素)print(ancestor_self)