Я пытаюсь сделать это (используя lxml):
//*[@id="32808345" or @id="33771423" or @id="15929470" or @id="33771117" or @id="15929266"]
чтобы получить все элементы, независимо от того, какой тег, с указанными идентификаторами. Я получаю следующую трассировку:
invalid attribute predicate
вот как я создаю str (если это относится к проблеме):
refs = ' or '.join('@id="%s"' % ref for ref in refs[0:5])
elements = etree.iterfind('//*[%s]' % refs)
EDIT, с приведенным ниже решением я получаю эту ошибку:
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
Нормальный способ сделать это - использовать оператор с одной трубкой, я полагаю?
//*[@id="20"] | //*[@id="30"] | ... etc.
Есть ли у вас фрагмент XML, который вы пытаетесь сделать?
Попробуйте использовать метод xpath
вместо iterfind
.
Я думаю, что метод iterfind
не принимает все выражения XPath.