Überprüfen Python ElementTree die Knoten / Elementart
-
26-09-2019 - |
Frage
Ich bin mit ElementTree und kann nicht herausfinden, ob die childNode Text ist oder nicht. childelement.text
scheint nicht zu arbeiten, wie es falsch positive gibt auch auf Knoten, die nicht Textknoten.
Irgendwelche Vorschläge?
Beispiel
<tr>
<td><a href="sdas3">something for link</a></td>
<td>tttttk</td>
<td><a href="tyty">tyt for link</a></td>
</tr>
Wenn Sie diese XML-Datei Parsen, das tue ich dies in Python:
for elem_main in container_trs: #elem_main is each tr
elem0 = elem_main.getchildren()[0] #td[0]
elem1 = elem_main.getchildren()[1] #td[1]
elem0 = elem_main.getchildren()[0]
print elem0.text
elem1 = elem_main.getchildren()[1]
print elem1.text
Der obige Code nicht ausgeben elem0.text; es ist leer. Ich sehe die elem1.text (das heißt, tttttk ) in der Ausgabe.
Update 2
Ich baue eigentlich ein Wörterbuch. Der Text aus dem Elemente mit jedem so, dass ich die HTML-Tabelle sortieren. Wie würde ich die s in diesem Code erhalten?
Lösung
Wie wäre es die getiterator
Methode iterate durch die alle absteigenden Knoten mit:
import xml.etree.ElementTree as xee
content='''
<tr>
<td><a href="sdas3">something for link</a></td>
<td>tttttk</td>
<td><a href="tyty">tyt for link</a></td>
</tr>
'''
def text_content(node):
result=[]
for elem in node.getiterator():
text=elem.text
if text and text.strip():
result.append(text)
return result
container_trs=xee.fromstring(content)
adict={}
for elem in container_trs:
adict[elem]=text_content(elem)
print(adict)
# {<Element td at b767e52c>: ['tttttk'], <Element td at b767e58c>: ['tyt for link'], <Element td at b767e36c>: ['something for link']}
Die Schleife for elem_main in container_trs:
iteriert durch die Kinder cantainer_trs
.
Im Gegensatz dazu ist die Schleife for elem_main in container_trs.getiterator():
iteraters durch container_trs
selbst und seine Kinder und Enkelkinder, etc.
Andere Tipps
elem0.text
ist keine, da der Text tatsächlich ein Teil des Subelement ist. Gehen Sie einfach eine Ebene tiefer:
print elem0.getchildren()[0].text
By the way, elem0[0].text
ist eine Abkürzung für das gleiche Konstrukt -. Keine Notwendigkeit für GetChildren ()