我正在尝试使用xml.etree模块复制BeautifulSoup的find_all功能。 由于某些原因,我们不允许使用bs4软件包,因此“美丽汤”不适合您。 有什么方法可以搜索特定标签,然后存储标签的每一行直到结束?
<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为我返回一个字典。
答案 0 :(得分:3)
为什么不使用xmlToDict
并遍历键?如果您只想使用常规字典,则可以在OrderedDict(like so)上使用json.dumps
,但这是一个示例,假定您要保留顺序。
这是假设您通过删除重复的<State>
标签并使用结束的</Data>
标签来修复XML。
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')])])])]