Xpath入门

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)
posted @ 2021-08-04 14:49  Mudrobot  阅读(66)  评论(0编辑  收藏  举报