Python elementtree Compruebe el tipo de nodo / elemento
-
26-09-2019 - |
Pregunta
Estoy utilizando elementtree y no puedo averiguar si el nodo hijo es texto o no. childelement.text
no parece que el trabajo ya que da falsos positivos incluso en los nodos que no son nodos de texto.
¿Alguna sugerencia?
Ejemplo
<tr>
<td><a href="sdas3">something for link</a></td>
<td>tttttk</td>
<td><a href="tyty">tyt for link</a></td>
</tr>
Después de analizar este archivo XML, hago esto en 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
El código anterior hace elem0.text no de salida; que está en blanco. Veo la elem1.text (es decir, tttttk ) en la salida.
Actualización 2
De hecho, estoy construyendo un diccionario. El texto del elemento con cada uno para que pueda ordenar la tabla HTML. ¿Cómo puedo obtener los s en este código?
Solución
Cómo sobre el uso del método getiterator
para iterar a través de los todos los nodos descendientes:
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']}
Los itera for elem_main in container_trs:
bucle a través de los hijos de cantainer_trs
.
En contraste, los iteraters for elem_main in container_trs.getiterator():
bucle a través de container_trs
sí mismo, y sus hijos, y nietos, etc.
Otros consejos
elem0.text
es Ninguno, porque el texto es en realidad parte del subelemento . Sólo tiene que ir un nivel más profundo:
print elem0.getchildren()[0].text
Por cierto, elem0[0].text
es un atajo para ese mismo constructo -. Hay necesidad de GetChildren ()