xPath方法
- 使用之前先安装好lxml库
pip i lxml
- xPath使用路径表达式在XML文档中进行导航
- 可以对本地的html文件进行解析也可以直接对html字符串进行解析
Xpath常用的规则
nodename
选取所有的子节点/
选取当前节点下的子节点//
选取当前节点的子孙节点.
选取当前节点..
选取当前节点的父节点@
选取属性
本地展示
# coding= utf-8
from lxml import etree
html = etree.parse('./index.html',etree.HTMLParser())
print(etree.tostring(html))
# coding= utf-8
from lxml import etree
fp = 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-8
from 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)