ElementTree和lxml的XPath 1.0/2.0/3.0/3.1解析器和选择器
项目描述
该软件包的目的是为ElementTree XML数据结构提供XPath 1.0、2.0、3.0和3.1选择器,适用于标准ElementTree库和lxml.etree库。
对于lxml.etree,该软件包可以用于提供XPath 2.0/3.0/3.1选择器,因为lxml.etree已经有了XPath 1.0的实现。
安装和使用
您可以在Python 3.8+环境中使用pip安装该软件包
pip install elementpath
要使用它,请导入软件包并在ElementTree节点上应用选择器
>>> import elementpath
>>> from xml.etree import ElementTree
>>> root = ElementTree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> elementpath.select(root, '/A/B2/*')
[<Element 'C1' at ...>, <Element 'C2' at ...>, <Element 'C3' at ...>]
《select》API 提供了标准的 XPath 结果格式,该格式为列表或基本数据类型的值。如果您只想遍历结果,可以使用接受与《select》相同参数的生成器函数《iter_select》。
选择器 API 也使用基于《lxml.etree》库的 XML 数据树。
>>> import elementpath
>>> import lxml.etree as etree
>>> root = etree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> elementpath.select(root, '/A/B2/*')
[<Element C1 at ...>, <Element C2 at ...>, <Element C3 at ...>]
当您需要将相同的 XPath 表达式应用于多个 XML 数据时,也可以使用《Selector》类,创建一个实例,然后将其用于对不同的 XML 数据应用路径。
>>> import elementpath
>>> import lxml.etree as etree
>>> selector = elementpath.Selector('/A/*/*')
>>> root = etree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> selector.select(root)
[<Element C1 at ...>, <Element C2 at ...>, <Element C3 at ...>]
>>> root = etree.XML('<A><B1><C0/></B1><B2><C1/><C2/><C3/></B2></A>')
>>> selector.select(root)
[<Element C0 at ...>, <Element C1 at ...>, <Element C2 at ...>, <Element C3 at ...>]
公共 API 类和函数在“Read the Docs”网站上的《elementpath》手册中描述。
默认情况下使用 XPath 2.0。如果您需要 XPath 1.0 解析器,请提供《parser》参数。
>>> from elementpath import select, XPath1Parser
>>> from xml.etree import ElementTree
>>> root = ElementTree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> select(root, '/A/B2/*', parser=XPath1Parser)
[<Element 'C1' at ...>, <Element 'C2' at ...>, <Element 'C3' at ...>]
对于 XPath 3.0/3.1,从《elementpath.xpath3》子包导入解析器,该子包默认不加载。
>>> from elementpath.xpath3 import XPath3Parser
>>> select(root, 'math:atan(1.0e0)', parser=XPath3Parser)
0.7853981633974483
注意:《XPath3Parser》是《XPath31Parser》的别名。
如果您只需要 XPath 3.0,也可以使用更具体的子包,避免加载 XPath 3.1 实现。
>>> from elementpath.xpath30 import XPath30Parser
>>> select(root, 'math:atan(1.0e0)', parser=XPath30Parser)
0.7853981633974483
贡献
您可以通过报告错误、使用问题跟踪器或通过拉取请求来为此软件包做出贡献。如果您打开一个问题,请尝试提供一个测试或测试数据以重现错误行为。提供的测试代码应添加到软件包的测试中。
XPath 解析器基于 Pratt 的自顶向下操作符优先级解析器实现。实现的解析器包括一些查找前瞻功能,注册令牌和扩展语言实现的辅助工具。此外,令牌类已使用《MutableSequence》作为基类进行泛化。有关基本内部类,请参阅《tdop.py》,有关扩展和解析器的基本用法,请参阅《xpath1_parser.py》。
如果您喜欢,可以使用《tdop.py》模块提供的基解析器和令牌来实现其他类型的解析器(我认为这可能也是一个有趣的练习!)。
许可证
本软件根据 MIT 许可证的条款进行分发。请参阅当前分发根目录中的“LICENSE”文件,或访问https://open-source.org.cn/licenses/MIT。
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。