Pitone ElementTree Controllare il / tipo di elemento di nodo
-
26-09-2019 - |
Domanda
Sto usando ElementTree e non riesco a capire se il childnode è un testo oppure no. childelement.text
non sembra funzionare in quanto dà falsi positivi anche sui nodi che non sono i nodi di testo.
Qualche suggerimento?
Esempio
<tr>
<td><a href="sdas3">something for link</a></td>
<td>tttttk</td>
<td><a href="tyty">tyt for link</a></td>
</tr>
Dopo l'analisi di questo file XML, faccio questo 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
Il codice sopra non elem0.text non uscita; esso è vuoto. Vedo l'elem1.text (cioè, tttttk ) in uscita.
Aggiorna 2
Sono in realtà la costruzione di un dizionario. Il testo dall'elemento ad ogni modo che io possa ordinare la tabella HTML. Come faccio a ottenere i s in questo codice?
Soluzione
Come sull'utilizzo del metodo getiterator
per scorrere i tutti i nodi discendenti:
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']}
I itera ciclo for elem_main in container_trs:
attraverso i figli di cantainer_trs
.
Al contrario, le iteraters ciclo for elem_main in container_trs.getiterator():
attraverso container_trs
stesso, ei suoi figli e nipoti, ecc.
Altri suggerimenti
elem0.text
è Nessuno perché il testo è in realtà parte del sottoelemento . Basta andare un livello più profondo:
print elem0.getchildren()[0].text
A proposito, elem0[0].text
è una scorciatoia per lo stesso costrutto -. Non c'è bisogno di GetChildren ()