XPath: сопоставить несколько элементов в одном выражении

1

Я пытаюсь сделать это (используя 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
  • 0
    Я не уверен, что влечет за собой реализация Python xpath, но xpath работает для меня на других языках.
Теги:
xpath
lxml

2 ответа

5
Лучший ответ

Нормальный способ сделать это - использовать оператор с одной трубкой, я полагаю?

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

Есть ли у вас фрагмент XML, который вы пытаетесь сделать?

  • 0
    см .: paste.pocoo.org/show/241242
  • 0
    Основываясь на этом XML, вышесказанное работает. Это то, что вы искали? Согласно mizar.dk/XPath/Default.aspx использование вышеуказанного с идентификаторами 2 и 7 соответствует элементам 2 и 7 в XML.
Показать ещё 3 комментария
1

Попробуйте использовать метод xpath вместо iterfind.

Я думаю, что метод iterfind не принимает все выражения XPath.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню