Python XPath SyntaxError: predicado no válido

estoy tratando de analizar un xml como

   XBV GHF   ash lplp    

y aqui esta mi codigo

 import xml.etree.ElementTree as ET tree = ET.parse("../../xml/test.xml") root = tree.getroot() path="./pages/page/paragraph[text()='GHF']" print root.findall(path) 

pero me sale un error

 print root.findall(path) File "X:\Anaconda2\lib\xml\etree\ElementTree.py", line 390, in findall return ElementPath.findall(self, path, namespaces) File "X:\Anaconda2\lib\xml\etree\ElementPath.py", line 293, in findall return list(iterfind(elem, path, namespaces)) File "X:\Anaconda2\lib\xml\etree\ElementPath.py", line 263, in iterfind selector.append(ops[token[0]](next, token)) File "X:\Anaconda2\lib\xml\etree\ElementPath.py", line 224, in prepare_predicate raise SyntaxError("invalid predicate") SyntaxError: invalid predicate 

¿Qué pasa con mi xpath?

Seguir

Gracias falsetru, tu solución funcionó. Tengo un seguimiento. Ahora, quiero obtener todos los elementos de párrafo que vienen antes del párrafo con texto GHF . Así que en este caso solo necesito el elemento XBV . Quiero ignorar las ash y lplp . Supongo que una forma de hacer esto sería

 result = [] for para in root.findall('./pages/page/'): t = para.text.encode("utf-8", "ignore") if t == "GHF": break else: result.append(para) 

¿Pero hay una mejor manera de hacer esto?

El soporte XPath de ElementTree es limitado. Utilice otra biblioteca como lxml :

 import lxml.etree root = lxml.etree.parse('test.xml') path="./pages/page/paragraph[text()='GHF']" print root.xpath(path) 

Como mencionó @falsetru, ElementTree no admite el predicado de text() , pero admite el elemento secundario por texto, por lo que en este ejemplo, es posible buscar una page que tenga un paragraph con texto específico, usando la ruta ./pages/page[paragraph='GHF'] . El problema aquí es que hay varias tags de paragraph en una page , por lo que uno tendría que iterar para el paragraph específico. En mi caso, necesitaba encontrar la version de una dependency en un maven pom.xml, y solo hay una única version secundaria por lo que funcionó lo siguiente:

 In [1]: import xml.etree.ElementTree as ET In [2] ns = {"pom": "http://maven.apache.org/POM/4.0.0"} In [3] print ET.parse("pom.xml").findall(".//pom:dependencies/pom:dependency[pom:artifactId='some-artifact-with-hardcoded-version']/pom:version", ns)[0].text Out[1]: '1.2.3'