python - 有没有办法将 xml 子标签存储在 python 的列表中?
问题描述
我正在尝试使用 xml.etree 模块复制 BeautifulSoup 的 find_all 功能。由于某些原因,我们不允许使用 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 为我返回一个字典。
解决方案
为什么不使用xmlToDict
和遍历键?如果你只想要一个普通的字典,你可以json.dumps
在 OrderedDict 上使用(就像这样),但这里有一个假设你想保留顺序的例子。
这是假设您通过删除该重复<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')])])])]
推荐阅读
- c++ - 从模板类继承时,Visual Studio Intellisense 不起作用
- c# - 无法在 asp dot net core 中重定向到我的本地页面
- c# - 在 c# 的大文本文件中查找具有特定日期的第一行的最佳“试错”算法是什么?
- javascript - 显示大学课程并使标题加粗
- sql - 如何按包含的实体搜索/选择,但将所有相关实体包含到结果集中
- gcc - 如何为 arm64 裸机实现 printf?
- javascript - 带或不带特殊字符的正则表达式阿拉伯字母
- google-sheets - 谷歌表:可以在下拉菜单中删除一个选项(数据验证)吗?
- python-3.x - 在 opencv 中使用 video.write 从图像创建 mp4 文件
- machine-learning - 基于欧几里得距离的 1-最近邻分类器如何对观察进行分类