zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    unsupported jsonb version number 123
    如何在MPlayer上支持RTSP
    TDengine 时序数据库的 ADO.Net Core 提供程序 Maikebing.EntityFrameworkCore.Taos
    如何使用IoTSharp对接ModBus?
    如何从源码启动和编译IoTSharp
    Asp.Net Core 自动适应Windows服务、Linux服务、手动启动时的内容路径的扩展方法
    MQTTnet 的Asp.Net Core 认证事件的扩展
    Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
    The remote certificate is invalid according to the validation procedure 远程证书验证无效
    settings插拔式源码
  • 原文地址:https://www.cnblogs.com/mudrobot/p/15098877.html
Copyright © 2011-2022 走看看