Python ElementTree Проверить тип узла / элемента - PullRequest
1 голос
/ 31 августа 2010

Я использую 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.text (то есть tttttk ) в выводе.

Обновление 2

Я на самом деле строю словарь.Текст из элемента с каждым, так что я могу отсортировать таблицу HTML.Как бы я получить с в этом коде?

Ответы [ 2 ]

1 голос
/ 31 августа 2010

elem0.text - Нет, потому что текст на самом деле является частью подэлемента .Просто зайдите на один уровень глубже:

print elem0.getchildren()[0].text

Кстати, elem0[0].text является ярлыком для той же конструкции - нет необходимости в getchildren ().

1 голос
/ 31 августа 2010

Как насчет использования метода 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, и его потомки, и внуки и т. д.

...