Получение всех вложенных детей в теге xml в python

У меня есть объект xml.etree.ElementTree со следующим содержимым.

<html>
 <body>
  <c>
   <winforms>
    <type-conversion>
     <opacity>
     </opacity>
    </type-conversion>
   </winforms>
  </c>
 </body>
</html>
<html>
 <body>
  <css>
   <css3>
    <internet-explorer-7>
    </internet-explorer-7>
   </css3>
  </css>
 </body>
</html>
<html>
 <body>
  <c>
   <code-generation>
    <j>
     <visualj>
     </visualj>
    </j>
   </code-generation>
  </c>
 </body>
</html>

Я хочу получить все теги в каждой паре тегов body. Например, вывод, который я хочу для приведенного выше примера:

c, winforms, type-conversion, opactiy
css, css3, internet-explorer-7
c, code-generation,j, visualj 

Как мне это сделать в python, используя BeautifulSoup или XML API ElementTree?


person Poorva Rane    schedule 20.02.2016    source источник
comment
Пожалуйста, опубликуйте свой код.   -  person Akram Parvez    schedule 20.02.2016
comment
Я не могу кодировать. Упомянутые выше данные xml представлены в виде объекта xml.etree.ElementTree. Я хотел знать, существует ли функция xmltreeobject.functionName(), которая возвращает все вложенные дочерние узлы для данного корневого узла.   -  person Poorva Rane    schedule 20.02.2016
comment
Это неправильный XML-документ, он выглядит как объединение нескольких документов, поэтому, предположительно, существует внешний тег, обертывающий все эти XML-документы. Вы, вероятно, ищете ElementTree.findall(), который выбирает путь, чтобы найти все элементы, например. root.findall('html/body') или root.findall('.//body') [любая глубина] вернет все теги body (при условии наличия тега-обертки для всех документов xml).   -  person AChampion    schedule 20.02.2016


Ответы (1)


Во-первых, спецификация XML допускает наличие в документе только одного корневого элемента. Если это ваш фактический XML, вам нужно обернуть его временным корневым элементом перед синтаксическим анализом.

Теперь, имея правильно сформированный XML, вы можете использовать xml.etree для синтаксического анализа и использовать простое выражение XPath .//body//* для запроса всех элементов, либо прямых дочерних, либо вложенных, в пределах <body> элементов:

from xml.etree import ElementTree as et

raw = '''xml string as posted in the question'''
root = et.fromstring('<root>'+raw+'</root>')

target_elements = root.findall('.//body/*')

result = [t.tag for t in target_elements]
print result
# output :
# ['c', 'winforms', 'type-conversion', 'opacity', 'css', 'css3', 'internet-explorer-7', 'c', 'code-generation', 'j', 'visualj']
person har07    schedule 20.02.2016