Xpath入门


Xpath是在xml文档中搜索内容的一种语言,而html也相当于一种xml,所以我们可以用Xpath的方式在html中寻找我们需要的数据,下面代码就是一个例子,非常的简单,大家阅读一下应该就能明白:

# Xpath是在xml文档中搜索内容的一种语言
# html是xml的一个子集
html="""

    1
    野花遍地香
    1.23
    臭豆腐
    
        王者荣耀
        和平精英
        原神
        使命召唤
        
真的好玩!!!
卢本伟 大司马
""" from lxml import etree tree=etree.XML(html) #result=tree.path("/book") result=tree.xpath("/book/name/text()")#加入text()可以检索到当前路径下的文本 print(result)

输出内容:

['野花遍地香']

这个时候如果我们想要检索author下nick的内容我们可以对源代码进行修改一下():
就将刚才的

result=tree.xpath("/book/name/text()")

改成

result=tree.xpath("/book/author/nick/text()")
# Xpath是在xml文档中搜索内容的一种语言
# html是xml的一个子集
html="""

    1
    野花遍地香
    1.23
    臭豆腐
    
        王者荣耀
        和平精英
        原神
        使命召唤
        
真的好玩!!!
卢本伟 大司马
""" from lxml import etree tree=etree.XML(html) #result=tree.path("/book") result=tree.xpath("/book/author/nick/text()")# 只更改了这一行 print(result)

输出结果:

['王者荣耀', '和平精英', '原神', '使命召唤']

这个时候或许你可能想要的是author下所有的nick下的内容,那么我们不妨这样改一下:
将刚才的

result=tree.xpath("/book/author/nick/text()")

改为:

result=tree.xpath("/book/author//nick/text()")

//表示的是该标签下的所有nick标签
输出结果:

['王者荣耀', '和平精英', '原神', '使命召唤', '真的好玩!!!']

那如果我们把上面的这句话改成这样呢?
将:

result=tree.xpath("/book/author//nick/text()")

改为

result=tree.xpath("/book/author/*/nick/text()")

运行程序
输出结果:

['真的好玩!!!']

由此可以推出,/*/可以代表任意的一个标签节点(通配节点),但是不能是空

ok,下面我们再来讲讲更多的Xpath的一些用法。
我们以下面这个html为例:




    
    Title


    
    
  1. 飞机
  2. 大炮
  3. 火车
李嘉诚
胡辣汤

代码中非常详细的注释,这里就不作过多的讲解,大家细致阅读一下应该都可以理解,唯一需要提醒的就是Xpath起始编号是1不是我们常用的0!
代码:

html="""



    
    Title


    
    
  1. 飞机
  2. 大炮
  3. 火车
李嘉诚
胡辣汤
""" from lxml import etree tree=etree.XML(html)# 加载这个字符串作为XML ### Test1 拿到ul中三个超链接中的文字 result1=tree.xpath("/html/body/ul/li/a/text()") print("Test1",result1) ### Test2 只拿ul中三个超链接中的第一个 result2=tree.xpath("/html/body/ul/li[1]/a/text()")#注意起始计数是从1开始的,从这里可以看出来!!!!一定要注意,[]表示索引 print("Test2",result2) ### Test3 拿到href的值为dapao的中文 result3=tree.xpath("/html/body/ol/li/a[@href='dapao']/text()")#注意这里只有一个等号 print("Test3",result3) ### Test4 拿到大炮的href值 result4=tree.xpath("/html/body/ol/li/a/@href")# 这里不需要加text() print("Test4",result4) ### Test5 对ol下的所有li进行遍历,再来进行筛选 print("Test5") ol_li_list=tree.xpath("/html/body/ol/li") for li in ol_li_list: result5=li.xpath("./a/text()")#./表示的是当前的位置 print(result5) result5=li.xpath("./a/@href") print(result5)