Добавление условия ИЛИ в Findall, Lxml

У меня есть следующее выражение findall:

for r in p.findall('.//r'):
                 for a in r.findall('.//br'):
                    text+= " "
                 for c in r.findall('.//tab'):
                     text+= " "  

И я хочу добавить пробел в текстовую переменную, если встречу тег "br" или "tab" , но я хочу использовать одно выражение, а не два отдельных. что-то типа:

for a in r.findall('.//br'|'.//tab'):

но это возвращает ошибку неподдерживаемого типа операнда.

TypeError: unsupported operand type(s) for |: 'str' and 'str'

Каков правильный синтаксис для этого?


person Hypothetical Ninja    schedule 09.11.2014    source источник


Ответы (1)


Код использует оператор | для двух строковых операндов.

>>> 'a' | 'b'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for |: 'str' and 'str'

Укажите | внутри строкового литерала. И используйте xpath метод:

for a in r.xpath('.//br|.//tab'):

Если вы хотите использовать findall, объедините два списка в один и повторите его:

for a in r.findall('.//br') + r.findall('.//table'):

или с помощью itertools.chain:

import itertools

for a in itertools.chain(r.findall('.//br'), r.findall('.//table')):
person falsetru    schedule 09.11.2014
comment
возможно ли использовать findall ?? - person Hypothetical Ninja; 09.11.2014
comment
@Swordy, findall не поддерживает полное выражение XPath. Вы можете комбинировать findall с оператором python if, но это более подробно. - person falsetru; 09.11.2014
comment
@Swordy, как насчет этого? for a in r.findall('.//br') + r.findall('.//table'): ... - person falsetru; 09.11.2014
comment
круто, это работает..!! Это эквивалентно моему выражению с точки зрения времени вычисления или быстрее?? - person Hypothetical Ninja; 09.11.2014
comment
@Swordy, я не уверен. Как насчет timeit их самих. - person falsetru; 09.11.2014
comment
да, я сделаю это .. Не могли бы вы добавить метод findall в свой ответ, чтобы я мог его принять .. ?? - person Hypothetical Ninja; 09.11.2014
comment
На самом деле у меня было пространство имен w, поэтому оно не работало путем прямой конкатенации, и прежде чем я смог указать аргумент пространства имен в xpath , вы ответили выражением findall .. - person Hypothetical Ninja; 09.11.2014
comment
По этой ссылке есть хороший учебник по xml, я понял логику, прочитав отсюда, наконец!! diveintopython3.net/xml.html - person Hypothetical Ninja; 09.11.2014
comment
@Swordy, как я уже говорил, поддержка xpath findall ограничена. Упомянутый вами учебник также касается этого. - person falsetru; 09.11.2014
comment
да ... Прямо сейчас я просто заставляю это работать, со следующей недели я заменю все экземпляры findall на xpath. и кстати, время между вашим методом и моим такое же.. - person Hypothetical Ninja; 09.11.2014
comment
Давайте продолжим обсуждение в чате. - person Hypothetical Ninja; 09.11.2014