Python lxml库中的XPath函数:介绍Python中lxml库支持的XPath函数,包括XPath 1.0、2.0、3.0中的函数,以及lxml库自己扩展的函数。
lxml库是Python中一个非常强大的XML处理库,其中包含了许多XPath函数来方便地处理XML文档。以下是lxml库支持的一些XPath函数:
XPath 1.0函数:
- string(expr): 把一个表达式的值转换为字符串类型。
- concat(str1, str2, …): 把几个字符串拼接在一起。
- contains(str1, str2): 判断str1是否包含str2,返回布尔类型。
- count(expr): 返回节点集合的数量。
- normalize-space(str): 把字符串中多余的空格删除,返回新字符串。
- starts-with(str1, str2): 判断str1是否以str2开头,返回布尔类型。
代码演示:
from lxml import etree # 创建一个XML文档 root = etree.Element("pidancode") child1 = etree.SubElement(root, "top") child2 = etree.SubElement(child1, "mid") child3 = etree.SubElement(child2, "bottom") # 添加文本内容 child3.text = "皮蛋编程" # 将文档转换为字符串 xml_str = etree.tostring(root, encoding="utf-8") # 创建XPath解析器 parser = etree.XMLParser() tree = etree.fromstring(xml_str, parser) # 打印文档的字符串形式 print(etree.tostring(tree, encoding="utf-8", pretty_print=True).decode()) # 使用XPath 1.0函数 print(tree.xpath("string(//bottom)")) # 皮蛋编程 print(tree.xpath("concat('pidancode.com', ':', //bottom)")) # pidancode.com:皮蛋编程 print(tree.xpath("contains(//bottom, '编程')")) # True print(tree.xpath("count(//bottom)")) # 1 print(tree.xpath("normalize-space(' 皮蛋编程 ')")) # 皮蛋编程 print(tree.xpath("starts-with(//bottom, '皮蛋')")) # True
XPath 2.0函数:
- lower-case(str): 把字符串中的大写字母转换为小写字母。
- upper-case(str): 把字符串中的小写字母转换为大写字母。
- matches(str, pattern): 判断str是否匹配正则表达式pattern,返回布尔类型。
- replace(str, pattern, replacement): 把str中匹配正则表达式pattern的部分替换为replacement。
代码演示:
from lxml import etree import re # 创建一个XML文档 root = etree.Element("pidancode") child1 = etree.SubElement(root, "top") child2 = etree.SubElement(child1, "mid") child3 = etree.SubElement(child2, "bottom") # 添加文本内容 child3.text = "皮蛋编程" # 将文档转换为字符串 xml_str = etree.tostring(root, encoding="utf-8") # 创建XPath解析器 parser = etree.XMLParser() tree = etree.fromstring(xml_str, parser) # 打印文档的字符串形式 print(etree.tostring(tree, encoding="utf-8", pretty_print=True).decode()) # 使用XPath 2.0函数 print(tree.xpath("lower-case(//bottom)")) # 皮蛋编程 print(tree.xpath("upper-case(//bottom)")) # 皮蛋编程 print(tree.xpath("matches(//bottom, '编程')")) # True print(tree.xpath("replace(//bottom, '编程', '教育')")) # 皮蛋教育
XPath 3.0函数:
- array:size(arr): 返回数组arr的长度。
- tokenize(str, pattern): 把字符串切割成数组,使用正则表达式pattern指定切割规则。
- map:keys(map): 返回字典map的所有键。
- map:get(map, key): 返回字典map中键为key的值。
代码演示:
from lxml import etree # 创建一个XML文档 root = etree.Element("pidancode") child1 = etree.SubElement(root, "top") child2 = etree.SubElement(child1, "mid") child3 = etree.SubElement(child2, "bottom") # 添加文本内容 child3.text = "皮蛋编程" # 将文档转换为字符串 xml_str = etree.tostring(root, encoding="utf-8") # 创建XPath解析器 parser = etree.XMLParser() tree = etree.fromstring(xml_str, parser) # 打印文档的字符串形式 print(etree.tostring(tree, encoding="utf-8", pretty_print=True).decode()) # 使用XPath 3.0函数 print(tree.xpath("array:size(('pidancode.com', '皮蛋编程'))")) # 2 print(tree.xpath("tokenize('Python is fun!', '\W')")) # ['Python', 'is', 'fun', ''] print(tree.xpath("map:keys(map{x: 1, y: 2, z: 3})")) # ['x', 'y', 'z'] print(tree.xpath("map:get(map{x: 1, y: 2, z: 3}, 'y')")) # 2
lxml库自己扩展的函数:
- fn:exists(node): 判断节点node是否存在,返回布尔类型。
- fn:parent(node): 返回节点node的父节点。
- fn:children(node): 返回节点node的子节点。
- fn:is-root(node): 判断节点node是否为根节点,返回布尔类型。
代码演示:
from lxml import etree # 创建一个XML文档 root = etree.Element("pidancode") child1 = etree.SubElement(root, "top") child2 = etree.SubElement(child1, "mid") child3 = etree.SubElement(child2, "bottom") # 添加文本内容 child3.text = "皮蛋编程" # 将文档转换为字符串 xml_str = etree.tostring(root, encoding="utf-8") # 创建XPath解析器 parser = etree.XMLParser() tree = etree.fromstring(xml_str, parser) # 打印文档的字符串形式 print(etree.tostring(tree, encoding="utf-8", pretty_print=True).decode()) # 使用lxml库自己扩展的函数 print(tree.xpath("fn:exists(//bottom)")) # True print(tree.xpath("fn:parent(//bottom)")) # <Element mid at 0x7f8b83... print(tree.xpath("fn:children(//mid)")) # [<Element bottom at 0x7f8b846...] print(tree.xpath("fn:is-root(//bottom)")) # False print(tree.xpath("fn:is-root(/)")) # True
相关文章