该
*[local-name() = "elem"]语法应该可以工作,但是为了简化操作,您可以创建一个函数来简化部分或全部“通配符名称空间”
XPath表达式的构造。
我 在Ubuntu 10.04上 使用 python-lxml 2.2.4, 下面的脚本对我 有用
。您需要根据要为每个元素指定默认名称空间的方式自定义行为,并处理要折叠到表达式中的任何其他XPath语法:
import lxml.etreedef xpath_ns(tree, expr): "Parse a simple expression and prepend namespace wildcards where unspecified." qual = lambda n: n if not n or ':' in n else '*[local-name() = "%s"]' % n expr = '/'.join(qual(n) for n in expr.split('/')) nsmap = dict((k, v) for k, v in tree.nsmap.items() if k) return tree.xpath(expr, namespaces=nsmap)doc = '''<root xmlns="http://really-long-namespace.uri" xmlns:other="http://with-ambivalent.end/#"> <other:elem/></root>'''tree = lxml.etree.fromstring(doc)print xpath_ns(tree, '/root')print xpath_ns(tree, '/root/elem')print xpath_ns(tree, '/root/other:elem')输出:
[<Element {http://really-long-namespace.uri}root at 23099f0>][<Element {http://with-ambivalent.end/#}elem at 2309a48>][<Element {http://with-ambivalent.end/#}elem at 2309a48>]更新 :如果发现确实需要解析XPath,则可以签出py-dom-xpath之类的项目,该项目是XPath 1.0(大部分)的纯Python实现。至少可以使您对解析XPath的复杂性有所了解。



