【Python】爬虫解析利器:XPath
一,常用规则
1,选取节点
表达式 | 功能描述 |
---|---|
nodename | 选取此节点的所有节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取选取子孙节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
2,运算符
3,轴
4,功能函数
二,示例代码
引入lxml库
from lxml import etree
html = etree.HTML(text) #初始化一个HTML文本,构造一个XPath对象
result = etree.tostring(html) #修正补全HTML代码,结果为Bytes类型
print(result.decode('utf-8')) # decode方法转成str
#直接读取文本文件进行解析
html = etree.parse('E:\\foo.html',etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))
所有节点
//*
//nodename #获取所有nodename节点
子节点
//nodename/cnodename #获取所有nodename下的所有子节点cnodename
//nodename//dnodename #获取所有nodename下的所有子孙节点cnodename
父节点
//nodename/..
//nodename/parent::*
节点属性匹配
//nodename[@attr='xxx'] #获取属性attr为xxxx的节点
节点属性多值匹配,某些节点的某个属性可能有多值,通过contains()函数,限制属性的值
//nodename[contains(@attr,'xxxx')] #获取属性attr为xxxx的节点
多属性匹配节点,多个属性确定一个节点,通过’and’连接
//nodename[contains(@attr,'xxxx') and @attr2 = 'xxx']
文本获取
//nodename/text() #获取nodename的文本
属性获取
/nodename/cnodename/@attr #获取cnodename的属性attr的值
按序选择
//li[1] #获取第一个li节点
//li[last()] #获取最后一个li节点
//li[position()<3] #获取第一,二节点
//li[last()-2] #获取倒数第三个li节点
节点轴选择
//nodename/ancestor::* #获取nodename的所有先辈节点
//nodename/ancestor::fnodename #获取nodename的fnodename先辈节点
#ancestor比parent的选择范围更大
//nodename/attribute::* #选取nodename下的所有属性
//nodename/child::* #选取nodename的所有直接子节点
//nodename/descendant::* #选取nodename的所有子孙节点,包含子节点
//nodename/following::* #获取nodename之后的所有节点
//nodename/following-sibling::* #获取和nodename同级的所有节点
除此之外,可以通过在浏览器中,使用查看源代码,复制XPath
参考:
《Python3 网络爬虫开发实战》