Python elementtree تحقق من نوع العقدة / العنصر
-
26-09-2019 - |
سؤال
أنا أستخدم ElementTree ولا يمكنني معرفة ما إذا كان نهر الأطفال هو نص أم لا. childelement.text
لا يبدو أنه يعمل لأنه يعطي إيجابية زائفة حتى على العقد التي لا هي العقد النصية.
أي اقتراحات؟
مثال
<tr>
<td><a href="sdas3">something for link</a></td>
<td>tttttk</td>
<td><a href="tyty">tyt for link</a></td>
</tr>
بعد تحليل ملف XML هذا ، أقوم بذلك في 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
الرمز أعلاه لا يخرج elem0.text ؛ إنه فارغ. أرى النص elem1.tex TTTTTK) في الإخراج.
تحديث 2
أنا في الواقع بناء قاموس. النص من العنصر مع كل حتى أتمكن من فرز جدول HTML. كيف يمكنني الحصول على S في هذا الرمز؟
المحلول
ماذا عن استخدام getiterator
طريقة للتكرار من خلال جميع العقد النسل:
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']}
الحلقة for elem_main in container_trs:
يتكرر من خلال أطفال cantainer_trs
.
في المقابل ، الحلقة for elem_main in container_trs.getiterator():
التكرار من خلال container_trs
نفسها ، وأطفالها ، وأبدهم ، إلخ.
نصائح أخرى
elem0.text
لا شيء لأن النص هو في الواقع جزء من u003Ca>العنوان الفرعية. فقط اذهب إلى مستوى واحد أعمق:u003C/a>
print elem0.getchildren()[0].text
بالمناسبة، elem0[0].text
هو اختصار لنفس البناء - لا حاجة ل getchildren ().