让python的lxml模块的xpath支持正则表达式

发布时间 2023-07-05 11:38:15作者: 顺其自然,道法自然

python的lxml模块是处理xml文档的比较好用的工具, 其中的xpath函数可以检索指定的元素, 但是它不支持正则表达式, 比如某个属性的值是否匹配某个正则表达式, 就没有办法实现.
不过可以利用它的自定义函数扩展功能来实现, 如下代码所示:

import re
from lxml import etree
from lxml.etree import XPath, FunctionNamespace

def regex(context, pattern, elements):
    # 确保我们有一个元素
    if not elements:
        return False
    if elements[0]=='': return False
    # 将元素转换为字符串
    string = str(elements[0])
    # 执行正则表达式匹配
    return re.search(pattern, string) is not None

ns = FunctionNamespace(None)
ns['regex'] = regex


# 加载XML文件
tree = etree.parse('hierarchy.xml')

# 使用XPath选择符合条件的元素
elements = tree.xpath('//*[regex("看小视频",@text)]')
#elements = tree.xpath('//*[fn:matches(@text,"看小视频")]',namespaces={"fn": "http://www.w3.org/2005/xpath-functions"})

# 遍历选择到的元素
for element in elements:
    # 处理元素
    print(element.text)

这里面需要注意的是自定义函数regex的参数, 其中第一个参数context, 描述了xpath的当前执行环境, 比如当前节点等, 后面的两个参数才是用户传进去的参数, 最后一个参数要注意, 它是一个数组, 包含你指定的参数值, 比如@text表示元素的text属性的值, 对于没有这个属性的元素, 传进去的是一个空列表, 否则传进去的是text元素的值的列表.