代码之家  ›  专栏  ›  技术社区  ›  shahjapan

lxml版本问题-无法调用fndall方法!

  •  0
  • shahjapan  · 技术社区  · 15 年前

    self.doc.findall('.//field[@on_change]')
    
    
    File "/home/.../code_generator/xmlGenerator.py", line 158, in processOnChange
    onchangeNodes = self.doc.findall('.//field[@on_change]')
    File "etree.pyx", line 1042, in etree._Element.findall
    File "/usr/lib/python2.5/site-packages/lxml/_elementpath.py", line 193, in findall
    return _compile(path).findall(element)
    File "/usr/lib/python2.5/site-packages/lxml/_elementpath.py", line 171, in _compile
    p = Path(path)
    File "/usr/lib/python2.5/site-packages/lxml/_elementpath.py", line 88, in __init__
    "expected path separator (%s)" % (op or tag)
    SyntaxError: expected path separator ([)
    

    它可以在lxml=2.1的本地机器上完美地工作。

    related post

    1 回复  |  直到 8 年前
        1
  •  3
  •   Steven    15 年前

    ElementPath表达式中的谓词仅在更高版本中添加。原始的(c)ElementTree模块(包含在stdlib中)只有在版本1.3(在stdlib python 2.7中)才有此功能。Lxml从2.0版开始使用elementtree1.3兼容的表达式(当时elementtree1.3还是alpha)

    最简单的解决方法:使用 xpath() 方法,该方法可以使用实xpath表达式,而不是仅使用ElementPath支持的子集( lxml faq 解释了为什么两者都有 findall() )

    self.doc.xpath('.//field[@on_change]')
    

    [i for i in self.doc.findall('.//field') if i.get('on_change') is not None]