2016-06-08 2 views
-1

У меня есть XML-файл, который я бы хотел извлечь атрибут элемента на основе строки.Разбор XML-файла с использованием lxml на основе текстовой строки

В приведенном ниже примере я хотел бы найти все элементы, содержащие строку home (два элемента). Как только я получу элементы, я могу извлечь значение .

<?xml version="1.0" ?> 
<zAppointments reminder="15"> 
    <appointment> 
     <subject>Bring pizza home</subject> 
     <shape>circule</shape> 
    </appointment> 
    <appointment> 
     <subject>Bring hamburger home</subject> 
     <shape>box</shape> 
    </appointment> 
    <appointment> 
     <subject>Bring banana homes</subject> 
    </appointment> 
    <appointment> 
     <subject>Check MS Office website for updates</subject> 
    </appointment> 
</zAppointments> 

ответ

2

Используйте функцию contains() XPath:

//subject[contains(., 'home')]/text() 

Демо:

>>> import lxml.etree as ET 
>>> 
>>> data = """<?xml version="1.0" ?> 
... <zAppointments reminder="15"> 
...  <appointment> 
...   <subject>Bring pizza home</subject> 
...  </appointment> 
...  <appointment> 
...   <subject>Bring hamburger home</subject> 
...  </appointment> 
...  <appointment> 
...   <subject>Check MS Office website for updates</subject> 
... </appointment> 
... </zAppointments>""" 
>>> root = ET.fromstring(data) 
>>> root.xpath("//subject[contains(., 'home')]/text()") 
['Bring pizza home', 'Bring hamburger home'] 
+0

спасибо за ваш ответ. можно ли вернуть элемент текста тега? так как я хотел бы заблокировать значение _shape_, а также в случае, если я найду строку _home_ в моем элементе _appointment_ – Eagle

+0

@Eagle да, вы можете перебирать элементы через '// subject [contains (., 'home')] выражение , Затем получите текст из свойства '.text' .. – alecxe

Смежные вопросы