Фильтрация XML-файла для удаления строк с определенным текстом в них?

Например, предположим, у меня есть:

<div class="info"><p><b>Orange</b>, <b>One</b>, ...
<div class="info"><p><b>Blue</b>, <b>Two</b>, ...
<div class="info"><p><b>Red</b>, <b>Three</b>, ...
<div class="info"><p><b>Yellow</b>, <b>Four</b>, ...

И я хотел бы удалить все строки, содержащие слова, из списка, поэтому я буду использовать xpath только для тех строк, которые соответствуют моим критериям. Например, я мог бы использовать список как ['Orange', 'Red'] чтобы отметить нежелательные строки, поэтому в приведенном выше примере я бы хотел использовать только строки 2 и 4 для дальнейшей обработки.

Как я могу это сделать?

2 ответа

Используйте:

//div
  [not(p/b[contains('|Orange|Red|', 
                    concat('|', ., '|')
                   )
          ]
       )
  ]

Это выбирает любой div элементы в документе XML, так что он не имеет p ребенок которого b Значение строки дочернего элемента - это одна из строк в списке строк, разделенных по конвейеру, для использования в качестве фильтров.

Этот подход обеспечивает расширяемость, просто добавляя новые значения фильтра в список разделенных конвейерами, не изменяя ничего больше в выражении XPath.

Примечание. Если структура XML-документа известна статически, всегда избегайте использования // Псевдооператор XPath, поскольку он приводит к значительной неэффективности (замедлению).

import lxml.html as lh

# http://lxml.de/xpathxslt.html
# http://exslt.org/regexp/functions/match/index.html
content='''\
<table>
<div class="info"><p><b>Orange</b>, <b>One</b></p></div>
<div class="info"><p><b>Blue</b>, <b>Two</b></p></div>
<div class="info"><p><b>Red</b>, <b>Three</b></p></div>
<div class="info"><p><b>Yellow</b>, <b>Four</b></p></div>
</table>
'''
NS = 'http://exslt.org/regular-expressions'
tree = lh.fromstring(content)
exclude=['Orange','Red']
for elt in tree.xpath(
    "//div[not(re:test(p/b[1]/text(), '{0}'))]".format('|'.join(exclude)),
    namespaces={'re': NS}):
    print(lh.tostring(elt))
    print('-'*80)

доходность

<div class="info"><p><b>Blue</b>, <b>Two</b></p></div>

--------------------------------------------------------------------------------
<div class="info"><p><b>Yellow</b>, <b>Four</b></p></div>

--------------------------------------------------------------------------------
Другие вопросы по тегам