• python使用lxml的xpath解析xml


    1、安装lxml

    注意xml.etree.ElementTree也支持部分xpath,但是非常有限,只有如下:

     可以使用lxml模块,这个模块是ElementTree的升级版,但是需要安装,ElementTree是内建不用安装

    pip install lxml

    2、xpath语法

    ①、谓语

    路径表达式

    结果

    /bookstore/book[1]

    选取属于 bookstore 子元素的第一个 book 元素。

    /bookstore/book[last()]

    选取属于 bookstore 子元素的最后一个 book 元素。

    /bookstore/book[last()-1]

    选取属于 bookstore 子元素的倒数第二个 book 元素。

    /bookstore/book[position()<3]

    选取最前面的两个属于 bookstore 元素的子元素的 book 元素。

    //title[@lang]

    选取所有拥有名为 lang 的属性的 title 元素。

    //title[@lang='eng']

    选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。

    /bookstore/book[price>35.00]

    选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。

    /bookstore/book[price>35.00]/title

    选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

    ②、选取未知节点

    通配符

    描述

    *

    匹配任何元素节点。

    @*

    匹配任何属性节点。

    node()

    匹配任何类型的节点。

    ③、选取若干路径

    路径表达式

    结果

    //book/title | //book/price

    选取 book 元素的所有 title 和 price 元素。

    //title | //price

    选取文档中的所有 title 和 price 元素。

    /bookstore/book/title | //price

    选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

    ④、xpath轴

    轴名称

    结果

    ancestor

    选取当前节点的所有先辈(父、祖父等)。

    ancestor-or-self

    选取当前节点的所有先辈(父、祖父等)以及当前节点本身。

    attribute

    选取当前节点的所有属性。

    child

    选取当前节点的所有子元素。

    descendant

    选取当前节点的所有后代元素(子、孙等)。

    descendant-or-self

    选取当前节点的所有后代元素(子、孙等)以及当前节点本身。

    following

    选取文档中当前节点的结束标签之后的所有节点。

    namespace

    选取当前节点的所有命名空间节点。

    parent

    选取当前节点的父节点。

    preceding

    选取文档中当前节点的开始标签之前的所有节点。

    preceding-sibling

    选取当前节点之前的所有同级节点。

    self

    选取当前节点。

    ⑤、xpath运算符

    运算符

    描述

    实例

    返回值

    |

    计算两个节点集

    //book | //cd

    返回所有拥有 book 和 cd 元素的节点集

    +

    加法

    6 + 4

    10

    -

    减法

    6 - 4

    2

    *

    乘法

    6 * 4

    24

    div

    除法

    8 div 4

    2

    =

    等于

    price=9.80

    如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 false。

    !=

    不等于

    price!=9.80

    如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。

    <

    小于

    price<9.80

    如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。

    <=

    小于或等于

    price<=9.80

    如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。

    >

    大于

    price>9.80

    如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。

    >=

    大于或等于

    price>=9.80

    如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 false。

    or

    price=9.80 or price=9.70

    如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 false。

    and

    price>9.00 and price<9.90

    如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 false。

    mod

    计算除法的余数

    5 mod 2

    1

    3、使用

    from lxml import etree
    #载入xml文件
    parser = etree.XMLParser(enconding = "utf-8") root
    = etree.parse('xxx.xml',parser=parser) # 获取所有含有属性pulgin 的节点 ret= root.xpath('//*[@plugin]') #这里就是xpath for n in ret: print(n.tag, n.attrib)

    PS:

    1、除了上述的,还有很多函数,如find、findall

    2、基于字典,效率高;c/c++遍历xml一般是从头到尾,这个底层是hash

    3、xpath中的/代表根路径,//代表所有符合要求的

    4、xpath轴后接双冒号+节点名

    5、获取节点名和属性列表

    nodes = tree.xpath("//Node[@IsEnd='1']")
    for node in nodes:
        print(node.tag, node.attrib)

    6、获取节点的路径,由所有路径上所有节点名拼接

    nodes = tree.xpath("//Node[@IsEnd='1']")
    for node in nodes:
        print(tree.getpath(node))

    7、获取指定节点对象的所有父节点

    nodes = tree.xpath("//Node[@IsEnd='1']")
    for node in nodes:
        print(node.xpath("ancestor::Node"))
  • 相关阅读:
    addEventListener-第三个参数 useCapture
    介绍(javascript调试)
    Linux_PXE服务器_RHEL7
    Linux_PXE服务器_RHEL7
    Linux_OpenSSH远程连接
    Linux_OpenSSH远程连接
    Python基本语法_强制数据类型转换
    Python基本语法_强制数据类型转换
    Linux_NetworkManager_RHEL7
    Linux_NetworkManager_RHEL7
  • 原文地址:https://www.cnblogs.com/judes/p/16328003.html
Copyright © 2020-2023  润新知