Есть ли способ сохранить вложенные теги XML в списке в Python? - PullRequest
1 голос
/ 23 мая 2019

Я пытаюсь повторить функциональность функции find_all BeautifulSoup, используя модуль xml.etree. По некоторым причинам нам не разрешают использовать пакеты bs4, и поэтому Beautiful soup выходит за рамки уравнения. Есть ли способ, где я могу найти определенный тег, а затем сохранить каждую строку тега до конца?

<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <State name="Singapore"><State name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </State>

Мне нужно что-то вроде получения сведений о теге State в списке.

[<State name="Singapore">,<rank>4</rank>,.....,'</state>']

к сожалению, когда я пытаюсь перебрать файл XML, он дает мне объект с точным содержимым. и .attrib возвращает мне диктат.

1 Ответ

3 голосов
/ 23 мая 2019

Почему бы не использовать xmlToDict и перебирать ключи? Вы можете использовать json.dumps в OrderedDict (, например, ), если вы просто хотите использовать обычный диктовку, но вот пример, предполагающий, что вы хотите сохранить порядок.

Предполагается, что вы исправили свой XML, удалив этот дубликат тега <State> и использовав закрывающий тег </Data>.

import xmltodict
from collections import OrderedDict

def listRecursive(d, key):
    for k, v in d.items():
        if isinstance(v, OrderedDict):
            for found in listRecursive(v, key):
                yield found
        if k == key:
            yield v

with open('PATH\\TO\\xmlFile.xml') as fd:
    xmlDict = xmltodict.parse(fd.read())

states = []
for result in listRecursive(xmlDict, 'State'):
    states.append(result)
states = states[0]

Вот pprint результатов, при условии, что вы добавите другой штат после Сингапура с именем NewState

[OrderedDict([('@name', 'Singapore'),
              ('rank', '4'),
              ('year', '2011'),
              ('gdppc', '59900'),
              ('neighbor',
               OrderedDict([('@name', 'Malaysia'), ('@direction', 'N')]))]),
 OrderedDict([('@name', 'NewState'),
              ('rank', '7'),
              ('year', '2020'),
              ('gdppc', '99999'),
              ('neighbor',
               [OrderedDict([('@name', 'Unknown1'), ('@direction', 'S')]),
                OrderedDict([('@name', 'Unknown2'), ('@direction', 'N')])])])]
...