【发布时间】:2020-05-20 23:01:55
【问题描述】:
我正在使用 lxml 库中的 xpath 解析 XML 的响应。 我正在获取结果并从中创建列表,如下所示:
object_name = [o.text for o in response.xpath('//*[name()="objectName"]')]
object_size_KB = [o.text for o in response.xpath('//*[name()="objectSize"]')]
我想使用列表为列表中的每个元素创建一个字典,然后将它们添加到最终列表中,如下所示:
[{'object_name': 'file1234', 'object_size_KB': 9347627},
{'object_name': 'file5671', 'objeobject_size_KBt_size': 9406875}]
我想要一个生成器,因为我将来可能需要从响应中搜索更多元数据,所以我希望我的代码能够面向未来并减少重复:
meta_names = {
'object_name': '//*[name()="objectName"]',
'object_size_KB': '//*[name()="objectSize"]'
}
def parse_response(response, meta_names):
"""
input: response: api xml response text from lxml xpath
input: meta_names: key names used to generate dictionary per object
return: list of objects dictionary
"""
mylist = []
# create list of each xpath match assign them to variables
for key, value in meta_names.items():
mylist.append({key: [o.text for o in response.xpath(value)]})
return mylist
但是这个函数给了我这个:
[{'object_name': ['file1234', 'file5671']}, {'object_size_KB': ['9347627', '9406875']}]
我一直在论坛中寻找类似案例,但找不到符合我需求的案例。 感谢您的帮助。
更新: Renneys 的答案是我想要的,我只是调整了结果范围的长度值,因为每个对象键的 xpath 长度并不总是相同,而且我的列表具有相同的每次我选择第一个索引 [0] 时的长度。 现在函数看起来像这样。
def create_entries(root, keys):
tmp = []
for key in keys:
tmp.append([o.text for o in root.xpath('//*[name()="' + key + '"]')])
ret = []
# print(len(tmp[0]))
for i in range(len(tmp[0])):
add = {}
for j in range(len(keys)):
add[keys[j]] = tmp[j][i]
ret.append(add)
return ret
【问题讨论】:
-
我不明白,你为什么要单独的字典?
-
所以我可以遍历每个 dict 来创建一个正文以在 elasticsearch 中进行索引
标签: python list dictionary dictionary-comprehension