Xpath是在xml文档中搜索内容的一种语言,而html也相当于一种xml,所以我们可以用Xpath的方式在html中寻找我们需要的数据,下面代码就是一个例子,非常的简单,大家阅读一下应该就能明白:
# Xpath是在xml文档中搜索内容的一种语言
# html是xml的一个子集
html="""
<book>
<id>1</id>
<name>野花遍地香</name>
<price>1.23</price>
<nick>臭豆腐</nick>
<author>
<nick id="10086">王者荣耀</nick>
<nick id="10010">和平精英</nick>
<nick class="game">原神</nick>
<nick class="joy">使命召唤</nick>
<div>
<nick>真的好玩!!!</nick>
</div>
</author>
<partner>
<nick id="LBW">卢本伟</nick>
<nick id="DSM">大司马</nick>
</partner>
</book>
"""
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="""
<book>
<id>1</id>
<name>野花遍地香</name>
<price>1.23</price>
<nick>臭豆腐</nick>
<author>
<nick id="10086">王者荣耀</nick>
<nick id="10010">和平精英</nick>
<nick class="game">原神</nick>
<nick class="joy">使命召唤</nick>
<div>
<nick>真的好玩!!!</nick>
</div>
</author>
<partner>
<nick id="LBW">卢本伟</nick>
<nick id="DSM">大司马</nick>
</partner>
</book>
"""
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为例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body>
<ul>
<li><a href="http://www.baidu.com">百度</a></li>
<li><a href="http://www.google.com">谷歌</a></li>
<li><a href="http://www.sougou.com">搜狗</a></li>
</ul>
<ol>
<li><a href="feiji">飞机</a></li>
<li><a href="dapao">大炮</a></li>
<li><a href="huoche">火车</a></li>
</ol>
<div class="job">李嘉诚</div>
<div class="common">胡辣汤</div>
</body>
</html>
代码中非常详细的注释,这里就不作过多的讲解,大家细致阅读一下应该都可以理解,唯一需要提醒的就是Xpath起始编号是1不是我们常用的0!
代码:
html="""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body>
<ul>
<li><a href="http://www.baidu.com">百度</a></li>
<li><a href="http://www.google.com">谷歌</a></li>
<li><a href="http://www.sougou.com">搜狗</a></li>
</ul>
<ol>
<li><a href="feiji">飞机</a></li>
<li><a href="dapao">大炮</a></li>
<li><a href="huoche">火车</a></li>
</ol>
<div class="job">李嘉诚</div>
<div class="common">胡辣汤</div>
</body>
</html>
"""
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)