Фильтрация 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>
--------------------------------------------------------------------------------