2016-06-08 5 views
-1

Ich habe eine XML-Datei, die ich möchte Text Attribut eines Elements basierend auf einer Zeichenfolge abrufen.Parsed eine XML-Datei mit lxml basierend auf Textstring

In dem Beispiel unten möchte ich alle Subjektelemente finden, die die Zeichenfolge home (zwei Elemente) enthält. Sobald ich die Elemente bekomme, kann ich den Wert Text Wert abrufen.

<?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> 

Antwort

2

Verwenden Sie die contains() XPath-Funktion:

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

Demo:

>>> 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

Dank für Ihre Antwort. Wäre es möglich, das Element des Tag-Textes zurückzugeben? da ich den Wert von _shape_ auch dann gate, wenn ich die Zeichenkette _home_ in meinem Element _appointment_ – Eagle

+0

@Eagle ja finde, können Sie Elemente über '// subject [contains (., 'home')]' expression durchlaufen . Dann hol dir den Text von der Eigenschaft '.text' – alecxe