<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"/><title>测试页面</title></head><body><ol><liclass="haha">醉卧沙场君莫笑,古来征战几人回</li><liclass="heihei">两岸猿声啼不住,轻舟已过万重山</li><liid="hehe"class="nene">一骑红尘妃子笑,无人知是荔枝来</li><liclass="xixi">停车坐爱枫林晚,霜叶红于二月花</li><liclass="lala ">商女不知亡国恨,隔江犹唱后庭花</li></ol><divid="pp"><div><ahref="http://www.baidu.com">李白</a></div><ol><liclass="huanghe">君不见黄河之水天上来,奔流到海不复回</li><liid="tata"class="hehe">李白乘舟将欲行,忽闻岸上踏歌声</li><liclass="tanshui kkk">桃花潭水深千尺,不及汪伦送我情</li></ol><divclass="hh"><ahref="http://mi.com">雷军</a></div><ol><liclass="dudu">are you ok</li><liclass="meme">会飞的猪</li></ol></div></body></html>
获取节点
from lxml import etree
# 1、把html字符串创建成一棵节点树
test_tree = etree.parse("./test.html")# parse函数用于读取本地文件,并且将其中的html字符串转化成节点树print(test_tree)#<lxml.etree._ElementTree object at 0x0000000002B91C48># 2、从节点树中提取节点
ret = test_tree.xpath("/html/body/ol/li[3]")# 这个函数用于从节点树中,根据节点的路径来提取节点#[<Element li at 0x2b92d48>]# 这个函数返回值是一个列表,列表中是符合条件的所有的节点
ret = test_tree.xpath("/html/body/div/div[1]/a")#[<Element a at 0x2b92e48>]# 获取页面上所有的li节点
ret = test_tree.xpath("//li")# 【注意】在节点定位的过程中,"/"代表当前节点的子节点,"//"代表当前节点的后代节点#[<Element li at 0x2b92e88>, <Element li at 0x2b92ec8>, <Element li at 0x2b92d48>, <Element li at 0x2b92f08>, <Element li at 0x2b92f48>, <Element li at 0x2b92fc8>, <Element li at 0x2bb5048>, <Element li at 0x2bb5088>, <Element li at 0x2bb50c8>, <Element li at 0x2b92f88>]# 3、获取节点的属性# 【注意】在xpath语法中,所有的属性前面都要用@符号
ret = test_tree.xpath("/html/body/div/div[1]/a/@href")#['http://www.baidu.com']#4、获取节点中的文本内容
ret = test_tree.xpath("/html/body/ol/li[2]/text()")#['两岸猿声啼不住,轻舟已过万重山']# 提取当前节点和所有的后代节点的所有文本
ret = test_tree.xpath("/html/body/ol//text()")#['\n ', '醉卧沙场君莫笑,古来征战几人回', '\n ', '两岸猿声啼不住,轻舟已过万重山', '\n ', '一骑红尘妃子笑,无人知是荔枝来', '\n ', '停车坐爱枫林晚,霜叶红于二月花', '\n ', '商女不知亡国恨,隔江犹唱后庭花', '\n']# 提取当前节点和所有的后代节点的class属性
ret = test_tree.xpath("/html/body/ol//@class")#['haha', 'heihei', 'nene', 'xixi', 'lala']# 5、属性定位# 找所有带id属性的li
ret = test_tree.xpath("//li[@id]/text()")#['一骑红尘妃子笑,无人知是荔枝来', '李白乘舟将欲行,忽闻岸上踏歌声']# 找出所有的class值为dudu的li
ret = test_tree.xpath("//li[@class='dudu']/text()")#['are you ok']# 【注意】xpath不是css选择器,在用属性修饰的时候,必须把属性的值写全
ret = test_tree.xpath("//li[@class='tanshui kkk']/text()")#['桃花潭水深千尺,不及汪伦送我情']
ret = test_tree.xpath("//li[@class='lala ']/text()")#['商女不知亡国恨,隔江犹唱后庭花']# 6、模糊匹配# 包含:查找所有的class中包含e的li
ret = test_tree.xpath('//li[contains(@class,"e")]/text()')# 开头:查找所有的class以h开头的那些li
ret = test_tree.xpath("//li[starts-with(@class,'h')]/text()")# 7、逻辑匹配# 与:查找所有的带id属性并且class值为hehe的那些li
ret = test_tree.xpath("//li[@id and @class='hehe']/text()")# 或:查找所有的带id值或者带class值的div
ret = test_tree.xpath("//div[@id or @class]")print(ret)# 8、相对路径# 以上的xpath路径在查找节点的时候都是从根节点开始查找,此时的xpath路径是绝对路径
obj = test_tree.xpath("//div[@id='pp']")[0]# 现在我们希望从obj这个节点的内部进行查找
ret2 = obj.xpath("//li/text()")# xpath语法的绝对路径的查找和用谁来调xpath函数没有关系
ret2 = obj.xpath(".//li/text()")# 用相对路径来查找,谁调用的xpath函数,就会基于谁为根进行查找# 用obj这个节点对象来查找xpathprint(ret2)#['君不见黄河之水天上来,奔流到海不复回', '李白乘舟将欲行,忽闻岸上踏歌声', '桃花潭水深千尺,不及汪伦送我情', 'are you ok', '会飞的猪']