• XPath的使用


    1、Xpath概览

            Xpath的全称是XML Path Language,即XML路径语言,用来在XML文档中查找信息。它虽然最初是用来搜寻XML文档的,但同样适用于HTML文档的搜索。

    2、XPath常用规则

    XPath的常用规则
    表达式描述
    nodename选取此节点的所有节点
    /从当前节点选取直接子节点
    //从当前节点选取子孙节点
    .选取当前节点
    ..选取当前节点的父节点

    @

    选取属性

    3、实例引入

    1. from lxml import etree
    2. text = '''
      • first item
    3. first item
  • first item
  • first item
  • first item
  • '''
  • # 调用HTML类进行初始化,构造一个XPath解析对象
  • # etree模块可以自动修复HTML代码
  • html = etree.HTML(text)
  • # 输出修正后的HTML代码,但结果是bytes类型
  • result = etree.tostring(html)
  • # 利用decode方法将其转换为str类型
  • print(result.decode('utf-8'))
  • 4、所有节点

    1. from lxml import etree
    2. text = '''
      • first item
      • first item
      • first item
      • first item
      • first item
      • '''
      • # 调用HTML类进行初始化,构造一个XPath解析对象
      • # etree模块可以自动修复HTML代码
      • html = etree.HTML(text)
      • # # 输出修正后的HTML代码,但结果是bytes类型
      • # result = etree.tostring(html)
      • # # 利用decode方法将其转换为str类型
      • # print(result.decode('utf-8'))
      • # *表示匹配所有节点
      • result = html.xpath('//*')
      • print(result)

      5、子节点

      1. from lxml import etree
      2. text = '''
        • first item
        • first item
        • first item
        • first item
        • first item
        • '''
        • # 调用HTML类进行初始化,构造一个XPath解析对象
        • # etree模块可以自动修复HTML代码
        • html = etree.HTML(text)
        • # # 输出修正后的HTML代码,但结果是bytes类型
        • # result = etree.tostring(html)
        • # # 利用decode方法将其转换为str类型
        • # print(result.decode('utf-8'))
        • # *表示匹配所有节点
        • # result = html.xpath('//*')
        • # print(result)
        • # 子节点
        • result = html.xpath('//li/a')
        • print(result)

        6、父节点

        1. from lxml import etree
        2. text = '''
          • first item
          • first item
          • first item
          • first item
          • first item
          • '''
          • # 调用HTML类进行初始化,构造一个XPath解析对象
          • # etree模块可以自动修复HTML代码
          • html = etree.HTML(text)
          • # # 输出修正后的HTML代码,但结果是bytes类型
          • # result = etree.tostring(html)
          • # # 利用decode方法将其转换为str类型
          • # print(result.decode('utf-8'))
          • # *表示匹配所有节点
          • # result = html.xpath('//*')
          • # print(result)
          • # 子节点
          • # result = html.xpath('//li/a')
          • # print(result)
          • # 父节点
          • result = html.xpath('//a[@href="link4.html"]/../@class')
          • print(result)

          7、属性匹配

          1. from lxml import etree
          2. text = '''
            • first item
            • first item
            • first item
            • first item
            • first item
            • '''
            • # 调用HTML类进行初始化,构造一个XPath解析对象
            • # etree模块可以自动修复HTML代码
            • html = etree.HTML(text)
            • # # 输出修正后的HTML代码,但结果是bytes类型
            • # result = etree.tostring(html)
            • # # 利用decode方法将其转换为str类型
            • # print(result.decode('utf-8'))
            • # *表示匹配所有节点
            • # result = html.xpath('//*')
            • # print(result)
            • # 子节点
            • # result = html.xpath('//li/a')
            • # print(result)
            • # 父节点
            • # result = html.xpath('//a[@href="link4.html"]/../@class')
            • # print(result)
            • # 属性匹配
            • result = html.xpath('//li[@class="item-0"]')
            • print(result)

            8、文本获取

            1. from lxml import etree
            2. text = '''
              • first item
              • first item
              • first item
              • first item
              • first item
              • '''
              • # 调用HTML类进行初始化,构造一个XPath解析对象
              • # etree模块可以自动修复HTML代码
              • html = etree.HTML(text)
              • # # 输出修正后的HTML代码,但结果是bytes类型
              • # result = etree.tostring(html)
              • # # 利用decode方法将其转换为str类型
              • # print(result.decode('utf-8'))
              • # *表示匹配所有节点
              • # result = html.xpath('//*')
              • # print(result)
              • # 子节点
              • # result = html.xpath('//li/a')
              • # print(result)
              • # 父节点
              • # result = html.xpath('//a[@href="link4.html"]/../@class')
              • # print(result)
              • # 属性匹配
              • # result = html.xpath('//li[@class="item-0"]')
              • # print(result)
              • # 文本获取
              • result = html.xpath('//li[@class="item-0"]/a/text()')
              • print(result)

              9、属性获取

              1. from lxml import etree
              2. text = '''
                • first item
                • first item
                • first item
                • first item
                • first item
                • '''
                • # 调用HTML类进行初始化,构造一个XPath解析对象
                • # etree模块可以自动修复HTML代码
                • html = etree.HTML(text)
                • # # 输出修正后的HTML代码,但结果是bytes类型
                • # result = etree.tostring(html)
                • # # 利用decode方法将其转换为str类型
                • # print(result.decode('utf-8'))
                • # *表示匹配所有节点
                • # result = html.xpath('//*')
                • # print(result)
                • # 子节点
                • # result = html.xpath('//li/a')
                • # print(result)
                • # 父节点
                • # result = html.xpath('//a[@href="link4.html"]/../@class')
                • # print(result)
                • # 属性匹配
                • # result = html.xpath('//li[@class="item-0"]')
                • # print(result)
                • # 文本获取
                • # result = html.xpath('//li[@class="item-0"]/a/text()')
                • # print(result)
                • # 属性获取
                • result = html.xpath('//li/a/@href')
                • print(result)

                10、属性多值匹配

                1. text2 = '''
                2. first item
                3. '''
                4. html2 = etree.HTML(text2)
                5. result = html2.xpath('//li[contains(@class, "li")]/a/text()')
                6. print(result)

                11、多属性匹配

                1. # 多属性匹配
                2. text2 = '''
                3. first item
                4. '''
                5. html2 = etree.HTML(text2)
                6. result = html2.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
                7. print(result)

                12、按序匹配

                1. # 按序选择
                2. # 注意:序号从1开始,不是从0开始
                3. result = html.xpath('//li[1]/a/text()')
                4. print(result)
                5. result = html.xpath('//li[last()]/a/text()')
                6. print(result)
                7. result = html.xpath('//li[position()>3]/a/text()')
                8. print(result)
                9. result = html.xpath('//li[last()-2]/a/text()')
                10. print(result)

                13、节点轴选择

                1. # 节点轴选择
                2. # 调用ancestor轴,获取所有祖先节点。这里使用*,表示匹配所有节点。
                3. result = html.xpath('//li[1]/ancestor::*')
                4. print(result)
                5. # 添加限制条件,只得到div节点的祖先节点
                6. result = html.xpath('//li[1]/ancestor::div')
                7. print(result)
                8. # 调用attribute轴,获得所有属性值
                9. result = html.xpath('//li[1]/attribute::*')
                10. print(result)
                11. # 调用child轴,可以获得所有子节点。这里加入限定条件,选取href="link1.html"的a节点
                12. result = html.xpath('//li[1]/child::a[@href="link1.html"]')
                13. print(result)
                14. # 调用descendant轴,获取所有子孙节点。这里加入限定条件,获取span节点
                15. result = html.xpath('//li[1]/descendant::span')
                16. print(result)
                17. # 调用following轴,可以获得当前节点之后的所有节点。这里设置了索引选择,,只获得第二个后继节点
                18. result = html.xpath('//li[1]/following::*[2]')
                19. print(result)
                20. # 调用following—sibling轴,可以获得当前节点之后的所有同级节点
                21. result = html.xpath('//li[1]/following-sibling::*')
                22. print(result)

              3. 相关阅读:
                数字集成电路设计(二、Verilog HDL基础知识)
                基于Zookeper的hadoop高可用HA精选
                教培机构如何线上抢客招生?
                petite-vue源码剖析-逐行解读@vue-reactivity之effect
                larvel 中的api.php_Laravel 开发 API
                零售抄表系统是什么?
                中国背景音乐服务行业经营效益与竞争格局分析报告2022-2028年
                关于论青少年尽早学少儿编程之说
                MBR主引导记录
                开源.NetCore通用工具库Xmtool使用连载 - XML操作篇
              4. 原文地址:https://blog.csdn.net/m0_72765822/article/details/139436873