• 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)
    
  • 相关阅读:
    测试 多线程 实现 callable 带返回值
    给定一个 hashMap 最终输出最大值的键
    正则判断输入的字符(英文、数字、空格、其他)的个数
    当返回值为json字符串时 如何获得其中的json数组
    thread run 和 start 的区别
    docker 构建dockerfile
    jsonp 跨域
    springsession 实现session 共享
    通过反射获得 spring 的 RequestMapping value值
    redis 集群搭建 以及 报错解决
  • 原文地址:https://www.cnblogs.com/mudrobot/p/15098877.html
Copyright © 2020-2023  润新知