PeterMmm
PeterMmm

Reputation: 24630

Problems with lxml

I have a Debian 6 setup that I won't touch too much.

$ python --version
Python 2.6.6
$ dpkg --list|grep lxml
ii  python-lxml                        2.2.8-2 

Im trying to access with XPath like this:

import xml.etree.ElementTree as ET
root = ET.parse("a.xml")

for e in root.findall('.//rec/data/field[@name="id"]'):
    print(e.tag + " " + e.attrib.get('name'))

I got an error

Traceback (most recent call last):
  File "a.py", line 4, in <module>
    for e in root.findall('.//rec/data/field[@name="id"]'):
  File "/usr/lib/python2.6/xml/etree/ElementTree.py", line 647, in findall
    return self._root.findall(path)
  File "/usr/lib/python2.6/xml/etree/ElementTree.py", line 355, in findall
    return ElementPath.findall(self, path)
  File "/usr/lib/python2.6/xml/etree/ElementPath.py", line 198, in findall
    return _compile(path).findall(element)
  File "/usr/lib/python2.6/xml/etree/ElementPath.py", line 176, in _compile
    p = Path(path)
  File "/usr/lib/python2.6/xml/etree/ElementPath.py", line 93, in __init__
    "expected path separator (%s)" % (op or tag)
SyntaxError: expected path separator ([)

Is this XPath syntax not supported by python-lxml 2.2.8 ?

What version support this and is compatible with python 2.6 ?

Upvotes: 0

Views: 503

Answers (1)

falsetru
falsetru

Reputation: 369054

The code is using ElementTree, not lxml.

findall method of ElementTree supports only subset of xpath. (XPath support in ElementTree).

[@attrib="value"] is also supported in ElementTree API 1.3. But ElementTree API is updated to 1.3 in Python 2.7.


Replace following line:

import xml.etree.ElementTree as ET

with:

import lxml.etree as ET

to use lxml.

Upvotes: 1

Related Questions