python lxml:不区分大小写的xpath标记名称匹配

时间:2015-06-25 09:41:10

标签: python xpath case lxml case-insensitive

我使用python + lxml来解析spss文件。

这个主题似乎有许多主题,但答案并不特别有帮助。

我遇到的答案:

- lower-case the entire input before parsing; 
- if you know the complete list of tags in advance

对我来说,这些建议需要花费太多时间。

相反,我想在必要时匹配字符串。

以下是我要编辑的代码行:

xpath("//definition//variable[@name='"+tag_name+"']")

如果tag_name为:

,如何获得匹配
tag_name = "Q1top"
tag_name = "q1Top"
tag_name = "q1TOP"
etc

我猜猜某种形式的正则表达式是为了???

2 个答案:

答案 0 :(得分:4)

Alternatively, you can incorporate regex from http://exslt.org/regular-expressions namespace in the XPath, for example :

ns = {"re": "http://exslt.org/regular-expressions"}
query = "//definition//variable[re:test(@name, '^{0}$', 'i')]".format(tag_name)
result = tree.xpath(query, namespaces=ns)

答案 1 :(得分:1)

使用local-nametranslate XPath函数:

>>> import lxml.etree
>>> 
>>> root = lxml.etree.fromstring('''
... <root>
...     <parent>
...         <Q1top>1</Q1top>
...         <q1Top>2</q1Top>
...         <q1TOP>3</q1TOP>
...     </parent>
... </root>
... ''')
>>> root.xpath('.//*[translate(local-name(), '
...            '"ABCDEFGHIJKLMNOPQRSTUVWXYZ", '
...            '"abcdefghijklmnopqrstuvwxyz")="q1top"]')
[<Element Q1top at 0x7fd663354a28>,
 <Element q1Top at 0x7fd663354830>,
 <Element q1TOP at 0x7fd6633549e0>]

<强>更新

>>> root.xpath('.//*[translate(local-name(), '
...            '"QTOP", '
...            '"qtop")="q1top"]')
[<Element Q1top at 0x7fd663354a28>,
 <Element q1Top at 0x7fd663354830>,
 <Element q1TOP at 0x7fd6633549e0>]