让python的lxml模块的xpath支持正则表达式
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元素的值的列表.