• day26-xpath数据解析


    day26-xpath数据解析

    xpath语法

    1.什么是Xpath(xml path 语言)—— 专门用来解析xml数据
    不同的编程语言如果想要进行数据交流,数据传输之前,必须转换成通用的数据格式(常用的有两种:json,xml)

    Xpath解析数据的原理:通过提供你需要的标签在整个网页中的路径,来找到对应的标签,进一步获取标签内容或者标签属性。

    python基于xpath做数据解析的工具:lxml第三方库

    2.xml数据——一种通用的数据格式
    xml数据是以表标签或元素为单位,通过标签内容或者标签属性来提供数据

    xml语法:<标签名 属性名1=属性值1 属性名2=属性值2…>标签内容</标签名>

    3.xpath常用的术语
    树————树结构(一个网页源代码,一个xml的数据本质就是一个树结构)
    节点————本质就是标签
    根节点————最外层的标签
    节点内容————双标签标签内容
    节点属性————标签属性

    4.Xpath语法

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

    from lxml import etree
    
    f = open('files/超市.xml',encoding='utf-8')
    root = etree.XML(f.read())
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2) 基于节点通过路径获取标签
    节点对象.xpath(路径)————根据路径获取对应的标签,返回值是一个列表,列表中的元属是对应的标签对象
    路径写法:
    a).绝对路径:/路径 (路径必须从根节点开始往后写)
    b).相对路径:./ (.当前节点,谁去点的xpath,当前节点就是谁)
    …/ (…当成节点的上层节点)
    如果路径是以./开始的,./可以省略
    c).任意路径://路径

    注意:绝对路径和任意路径,再写路径和获取标签的时候根xpath前面是那个标签没有任何关系

    #---------绝对路径-----------
    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('//goods/name')
    print(result)
    
    result = root.xpath('//staff')
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3).获取标签内容和标签属性
    a)获取标签内容:获取标签的路径/text()

    result = root.xpath('//goods/name/text()')
    print(result)  # ['泡面', '火腿肠', '矿泉水', '巧克力']
    
    • 1
    • 2

    b2)获取标签属性值:获取标签的路径/@属性名

    result = root.xpath('//goods/@id')
    print(result)  # ['d2', 'd1']
    
    • 1
    • 2

    4).谓语(条件)
    谓语的写法:[谓语]
    a)位置相关谓语

    [N] 第N个标签(N是任意正整数)
    [last()] 最后一个标签
    [last()-N] 获取倒数第N+1的标签
    [position()<N] ,[position()<=N],[position()>N],[position()>=N]

    result = root.xpath('//goods[3]/name/text()')
    print(result)   # ['矿泉水']
    result = root.xpath('//goods[last()]/name/text()')
    print(result)   # ['巧克力']
    result = root.xpath('//goods[last()-3]/name/text()')
    print(result)   # ['泡面']
    result = root.xpath('//goods[position()<3]/name/text()')
    print(result)   # ['泡面', '火腿肠']
    result = root.xpath('//goods[position()>=2]/name/text()')
    print(result)   # ['火腿肠', '矿泉水', '巧克力']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    b)属性相关谓语
    [@属性名=值] 获取指定属性为指定值的标签
    [@属性名] 获取拥有指定属性的标签

    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

    c)子标签内容相关谓语
    [子标签名>值]、[子标签名>=值]、[子标签名<值]、[子标签名<=值]、[子标签名=值]

    result = root.xpath('//goods[pirce=1.5]/name/text()')
    print(result)
    
    • 1
    • 2

    5)分支 - |

    路径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)通配符 - *

    xpath中可以用*来代表任意标签或者任意属性

    result = root.xpath("//goods/*/text()")
    print(result)   # ['泡面', '3.5', '120', '火腿肠', '1.5', '305', '矿泉水', '1.5', '1200', '巧克力', '11.5', '50']
    
    • 1
    • 2

    案例: 所有第一个员工的所有属性值

    result = root.xpath('//staff[1]/@*')
    print(result)
    
    • 1
    • 2

    案例:获取属性值为c2的所有标签

    result = root.xpath('//*[@*="c2"]')
    print(result)
    
    • 1
    • 2

    案例:获取id值为’d1’的标签

    result = root.xpath('//*[@id="d1"]')
    
    • 1

    注意:超市.xml文件内容:

    <supermarket>
        <adress>肖家河大厦</adress>
        <name>永辉超市</name>
        <staffs>
            <staff position="收营员" class="c2">张三</staff>
            <staff position="售货员" class="c2">小明</staff>
            <staff position="售货员">小红</staff>
            <staff position="促销员">小花</staff>
        </staffs>
        <all_goods>
            <goods class="c2">
                <name>泡面</name>
                <pirce>3.5</pirce>
                <count>120</count>
            </goods>
            <goods class="c2">
                <name>火腿肠</name>
                <pirce>1.5</pirce>
                <count>305</count>
            </goods>
            <goods class="c3" id="d2">
                <name>矿泉水</name>
                <pirce>1.5</pirce>
                <count>1200</count>
            </goods>
            <goods id="d1">
                <name>巧克力</name>
                <pirce>11.5</pirce>
                <count>50</count>
            </goods>
        </all_goods>
    </supermarket>
    
    • 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
    • 30
    • 31
    • 32
  • 相关阅读:
    YOLOV8改进:RefConv(即插即用!重参数化重聚焦卷积替代常规卷积,无额外推理成本下涨点明显!)
    【GitHub】如果在进行PR时忘记 cloning forked repo,该如何进行修补呢
    Perl爬虫程序的框架
    充电桩软硬件,赚钱新招数!-慧哥充电桩开源系统
    安卓案例:选项菜单
    携职教育:对于想进入财务工作的人来说,第一个证考CPA还是CMA?
    记录:Unity脚本的编写
    面渣逆袭:半个小时成功拿下阿里一面HashMap追魂二十三问
    后端学习 - Zookeeper & Kafka
    odoo在iot领域的发展情况
  • 原文地址:https://blog.csdn.net/qq_40752621/article/details/125495734