2010-07-24 5 views
1

Je suis en train de le faire (en utilisant lxml):XPath: correspondre à plusieurs éléments en une seule expression

//*[@id="32808345" or @id="33771423" or @id="15929470" or @id="33771117" or @id="15929266"] 

afin d'obtenir tous les éléments, peu importe l'étiquette, avec les ID spécifiés. Je reçois le retraçage suivant:

invalid attribute predicate 

voilà comment je suis générer la str (si cela est pertinent au problème):

refs = ' or '.join('@id="%s"' % ref for ref in refs[0:5]) 
elements = etree.iterfind('//*[%s]' % refs) 

EDIT, avec la solution ci-dessous, je suis obtenir cette erreur:

File "lxml.etree.pyx", line 1201, in lxml.etree._Element.iterchildren (src/lxml/lxml.etree.c:36294) 
    File "lxml.etree.pyx", line 2163, in lxml.etree.ElementChildIterator.__init__ (src/lxml/lxml.etree.c:45331) 
    File "lxml.etree.pyx", line 2118, in lxml.etree._ElementTagMatcher._initTagMatch (src/lxml/lxml.etree.c:44913) 
    File "apihelpers.pxi", line 1413, in lxml.etree._getNsTag (src/lxml/lxml.etree.c:21412) 
ValueError: Empty tag name 
+0

Je ne suis pas sûr de ce que l'implémentation de python xpath implique, mais le xpath fonctionne pour moi dans d'autres langages. – Wrikken

Répondre

4

La façon normale de faire cela est d'utiliser l'opérateur de tuyau unique, je crois?

//*[@id="20"] | //*[@id="30"] | ... etc. 

Avez-vous un extrait de XML, que vous essayez de faire ceci?

+0

voir: http://paste.pocoo.org/show/241242/ –

+0

Basé sur ce XML, ce qui précède fonctionne. Est-ce que c'est ce que tu cherchais? Selon http://www.mizar.dk/XPath/Default.aspx en utilisant ce qui précède avec ID 2 et 7 correspond aux membres 2 et 7 dans le XML. – kander

+0

ah, ok, vous avez changé votre poste, maintenant il semble fonctionner. Merci beaucoup! –

1

Essayez d'utiliser la méthode xpath au lieu de iterfind.

Je pense que la méthode iterfind n'accepte pas toutes les expressions XPath.

Questions connexes