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
李嘉诚
胡辣汤
代码中非常详细的注释,这里就不作过多的讲解,大家细致阅读一下应该都可以理解,唯一需要提醒的就是Xpath起始编号是1不是我们常用的0!
代码:
html="""
Title
李嘉诚
胡辣汤
"""
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)