前言
今天要说一个解析利器xpath解析,使用的库是lxml库,它是一个非常强大的数据抽取工具,哈哈,非常好用!建议掌握!那么怎么学呢?我想的是,你干每一件事都需要有一个目的,那么我们问自己学习的目的是什么呢?当然是爬虫解析网页,所以我们先从Xpath的使用开始说(如果你有看不懂的地方,没关系,建议你往下看,基本都会解答,小声BB)
1.Xpath使用
通常我们解析网页有这么几个需要获得的东西,节点,属性,文本,网页的解析都逃不过这三东西,那么我们来分别说说这几个东西!
1.节点
获取接待一般有三种获取方式,获取所有节点,获取父节点,获取子节点
from lxml import etree #导入lxml包的额etree模块
html=etree.parse('test',etree.HTMLParser())#指定解析器文档和HTML解析器
result=html.xpath('//*') #获取所有节点
result=html.xpath('//li') #获取该节点下所有子孙节点的li节点
#获取子节点
result=html.xpath('//li/a') #或者节点下的li下的a节点
2.属性
属性里分两种,一是获取节点的属性,二是在查找结点时候,根据结点的属性信息进行匹配
result=html.xpath('//li/a/@href') #获取a的href属性
result=html.xpath('//li//@href') #获取所有li下所有子孙节点的href属性
#根据属性信息陪陪特定节点
result=html.xpath('//li[@class="item-1"]')#匹配所有带有class=item-1属性的li节点
#某个属性有多个值,使用contains来匹配
result1=html.xpath('//li[contains(@class,"aaa")]/a/text()')
#需要根据多个属性确定一个节点时
result=html.xpath('//li[@class="aaa" and @name="fore"]/a/text()')
result1=html.xpath('//li[contains(@class,"aaa") and @name="fore"]/a/text()')
#两种写法效果相同
3.文本
result=html.xpath('//li[@class="item-1"]/a/text()') #获取a节点下文本的内容
result1=html.xpath('//li[@class="item-1"]//text()') #获取li下所有子孙节点的文本的内容
到这,基本的使用就是这样,下面来解释解释,里面的一些我们没有说的东西,像@,// 之类的符号
- 这类符号统称为Xpath的使用规则
nodename-------------------选取此节点的所有子节点
/---------------------------------从当前节点选取直接子节点
//--------------------------------从当前节点选取子孙节点
. --------------------------------选取当前节点
.. --------------------------------选取当前节点的父节点
@--------------------------------选取属性
- --------------------------------选择所有元素节点与元素名
@* ---------------------------选取所有属性
[@attrib]---------------------选取具有给定属性的所有元素
[@attrib='value']-----------选取给定属性具有给定值的所有元素
[tag]---------------------------选取所有具有指定元素的直接子节点
[tag='text']-------------------选取所有具有指定元素并且文本内容是text节点
- Xpath中还可以使用运算符作为连接条件来选择节点
or---或-----age=19 or age=20------如果age等于19或者等于20则返回true反正返回false
and---与---age>19 and age<21------如果age等于20则返回true,否则返回false
|-------取两个节点的集合----//book | //cd---返回所有拥有book和cd元素的节点集合
= 等于 age=19 true
!= 不等于 age!=19 true
其他运算符参考 W3Shool
- 按序选择
有时候在同一个节点里面,有很多相同的节点,我们需要选择其中一个或几个,或者选择指定的节点
result1=html.xpath('//li[1][contains(@class,"aaa")]/a/text()') #获取第一个
result2=html.xpath('//li[last()][contains(@class,"aaa")]/a/text()') #获取最后一个
其他的参考 Xpath函数
后记
其实有时候写着写着就不知道怎么写了,不知道用什么方法能说的更易懂,后来我想起来,做每一件事后又一个目的,那么我先问问目的是什么,我就从目的出发,路上遇到其他的东西在继续补充,希望这样能好一点!(鞠躬)