• Day26-Xpath数据解析


    Day26-Xpath数据解析

    1、xpath语法

    01、什么是Xpath(xml path 语言) - 专门用来解析xml数据
    不同的编程语言的程序如果想要进行数据交流,数据传输之前必须转换成通用的数据格式(常用的有两种:json、xml)
    Xpath解析数据的原理:通过提供你需要的标签在整个网页(xml)中的路径,来找到对应的标签,进一步获取标签内容或者标签属性。
    python基于xpath做数据解析的工具:lxml第三方库
    02、xml数据 - 一种通用的数据格式

    xml数据是以标签(元素)为单位,通过标签内容或者标签属性来提供数据。

    xml语法:<标签名 属性名1=属性值1 属性名2=属性值2 …>标签内容</标签名>
    案例:用json和xml来保存一个订单数据
    json版本:
    {
        "id": "oder028398923",
        "create_time": "2022-6-26 22:34:56",
        "pay_time": "2022-6-26 22:36:02",
        "goods_list":[
            {"goods_id": "9234233", "price": 123.00, "count": 2, "name": "XXX防晒霜"},
            {"goods_id": "7281911", "price": 32.00, "count": 1, "name": "拖鞋"}
        ]
    }
    
    <order id="oder028398923">
        <create_time>2022-6-26 22:34:56</create_time>
        <pay_time>2022-6-26 22:36:02</pay_time>
        <goods_list>
            <goods goods_id="9234233">
                <price>123.00</price>
                <count>2</count>
                <name>XXX防晒霜</name>
            </goods>
                
            <goods goods_id="7281911">
                <price>32.00</price>
                <count>1</count>
                <name>拖鞋</name>
            </goods>
        </goods_list>
    </order>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    03、xpath常用术语
    树: 树结构(一个网页源代码,一个xml数据本质就是一个树结构)
    节点: 本质就是标签
    根节点: 最外层的哪个标签
    节点内容: 双标签标签内容
    节点属性: 标签属性
    04、xpath语法

    from lxml import etree

    1)基于html数据或xml数据创建html或者xml对应的树并且获取根节点
    etree.HTML(网页源代码)、etree.XML(xml数据)

    f = open(‘files/超市.xml’, encoding=‘utf-8’)
    root = etree.XML(f.read())
    f.close()

    2)基于节点通过路径获取标签
    节点对象.xpath(路径) - 根据路径获取对应的标签,返回值是一个列表,列表中的元素是对应的标签对象

    路径写法:
    1.绝对路径: /路径 (路径必须从根节点开始往后写)
    2.相对路径:./路径 (.表示当前节点; 谁去点的xpath,当前节点就是谁)
    …/路径 (…表示当前节点的上层节点)
    注意:如果路径是以 ‘./’ 开始的,‘./’ 可以省略
    3.任意路径://路径
    注意:绝对路径和任意路径,在写路径和获取标签的时候跟xpath前面是哪个标签没有任何关系

    # 绝对路径
    result = root.xpath('/supermarket/name')
    print(result)
    
    result = root.xpath('/supermarket/staffs/staff')
    print(result)
    
    # 练习:通过写绝对路径,获取所有商品的商品名对应的标签
    result = root.xpath('/supermarket/all_goods/goods/name')
    print(result)
    
    # 相对路径
    all_goods = root.xpath('./all_goods')[0]
    
    # result = all_goods.xpath('/supermarket/all_goods/goods/name')
    # print(result)
    result = all_goods.xpath('./goods/name')
    print(result)
    
    # 任意路径
    result = root.xpath('//name')
    print(result)
    
    result = all_goods.xpath('//name')
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2、Xpath语法2

    from lxml import etree
    
    root = etree.XML(open('files/超市.xml', encoding='utf-8').read())
    
    # 01. 获取标签内容和标签属性
    # 1)获取标签内容:获取标签的路径/text()
    result = root.xpath('//goods/name/text()')
    print(result)       # ['泡面', '火腿肠', '矿泉水', '巧克力']
    
    # 2)获取标签属性值:获取标签的路径/@属性名
    result = root.xpath('//staff/@position')
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    02、谓语(条件)
    谓语的写法:[谓语]
    1)位置相关谓语
    [N] - 第N个标签(N是任意正整数)
    [last()] - 获取最后一个标签
    [last()-1] - 获取倒数第2个标签。这儿的1可以是其他任意的整数
    [position()>N]、 [position()>=N]、[position()<N]、[position()<=N]
    esult = root.xpath('//goods[2]/name/text()')
    print(result)       # ['火腿肠']
    
    result = root.xpath('//goods[last()]/name/text()')
    print(result)       # ['巧克力']
    
    result = root.xpath('//goods[last()-1]/name/text()')
    print(result)       # ['矿泉水']
    
    result = root.xpath('//goods[position()<=3]/name/text()')
    print(result)       # ['泡面', '火腿肠', '矿泉水']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    2)属性相关谓语
    [@属性名=值] - 获取指定属性为指定值的标签
    [@属性名] - 获取拥有指定属性的标签
    result = root.xpath('//goods[@class="c3"]/name/text()')
    print(result)
    
    result = root.xpath('//goods[@id="d1"]/name/text()')
    print(result)
    
    
    result = root.xpath('//goods[@class]/name/text()')
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    *3)子标签内容相关谓语

    [子标签名>值]、[子标签名>=值]、[子标签名<值]、[子标签名<=值]、[子标签名=值]

    result = root.xpath('//goods[pirce=1.5]/name/text()')
    print(result)
    
    • 1
    • 2
    分支 - |
    路径1|路径2 - 先通过路径1获取标签,如果获取不到再通过路径2获取(获取的是多个路径中第一个有效路径的结果)
    result = root.xpath('//goods/name1/text()|//goods/name2/text()')
    print(result)       # []
    
    result = root.xpath('//goods/name2/text()|//goods/name/text()')
    print(result)       # ['泡面', '火腿肠', '矿泉水', '巧克力']
    
    result = root.xpath('//goods/name/text()|//staffs/staff/text()')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    通配符 - *
    xpath中可以用*来代表任意标签或者任意属性
    result = root.xpath('//goods/name/text()')
    print(result)
    
    result = root.xpath('//goods/*/text()')
    print(result)       # ['泡面', '3.5', '120', '火腿肠', '1.5', '305', '矿泉水', '1.5', '1200', '巧克力', '11.5', '50']
    
    
    result = root.xpath('//*[@class="c2"]')
    print(result)
    
    # 所有第一个员工的所有属性值
    result = root.xpath('//staff[1]/@*')
    print(result)
    
    # 获取属性值为c2的所有标签
    result = root.xpath('//*[@*="c2"]')
    print(result)
    
    # 获取id值为'd1'的标签
    result = root.xpath('//*[@id="d1"]')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    Pytorch学习整理笔记(二)
    css --- 让人上头的flex
    【数据结构的——红黑树】
    计算机组成原理-----定点数原码和补码的乘法与除法
    数据结构之栈和队列
    Springboot学生成绩管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目
    redis中value/SortedSet
    爬虫入门到精通_框架篇18(Scrapy中选择器用法)_sector,xpath,css,re
    【Visual Studio Code----Shader编程环境配置】
    神经网络量化----为了部署而特别设计
  • 原文地址:https://blog.csdn.net/HunterQAQ/article/details/125488225