使用for循环创建json对象数组

u3r8eeie  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(211)

我尝试从html中提取值,然后将它们转换成一个json数组,到目前为止,我已经能够得到我想要的,但只是作为单独的字符串:
我做了两个for循环:

for line in games_html.findAll('div', class_="product_score"):
    score = "{'Score': %s}" % line.getText(strip=True)
    print(score)

for line in games_html.findAll('a'):
    title = "{'Title': '%s'}" % line.getText(strip=True)
    print(title)

其产生以下两个输出:

{'Title': 'Uncanny Valley'}
{'Title': 'Subject 13'}
{'Title': '2Dark'}
{'Title': 'Lethal VR'}
{'Title': 'Earthlock: Festival of Magic'}
{'Title': 'Knee Deep'}
{'Title': 'VR Ping Pong'}

以及

{'Score': 73}
{'Score': 73}
{'Score': 72}
{'Score': 72}
{'Score': 72}
{'Score': 71}
{'Score': 71}

(they更长,但你可以得到一个想法与此...)
我如何使用python创建一个json数组,看起来像这样:

[{'Title': 'Uncanny Valley', 'Score': 73}, {....}]

我将使用生成的数组来做其他事情....
我需要把循环中的元素存储到列表中,然后合并它们吗?你能给我的场景举个例子吗?

2izufjch

2izufjch1#

您需要维护两个列表,分别用于分数和标题,并将所有数据附加到这些列表中,而不是打印,然后zip这些列表沿着列表解析,以获得所需的输出:

import json
scores, titles = [], []
for line in games_html.findAll('div', class_="product_score"):
    scores.append(line.getText(strip=True))

for line in games_html.findAll('a'):
    titles.append(line.getText(strip=True))

score_titles = [{"Title": t, "Score": s} for t, s in zip(titles, scores)]
print score_titles
# Printing in JSON format
print json.dumps(score_titles)
332nm8kg

332nm8kg2#

ZdaR's post所示,要创建一个json,需要构建相应的Python数据结构(json数组的列表,json对象的字典),并在最后将其序列化,所以问题几乎与如何在循环中创建列表相同,因为在创建列表之后,剩下的就是序列化,这就像json.loads(data)一样简单。
OP中的任务可以在两个循环中完成:

data = [{'Title': line.getText(strip=True)} for line in games_html.findAll('a')]

for i, line in enumerate(games_html.findAll('div', class_="product_score")):
    data[i]['Score'] = line.getText(strip=True)

# serialize to json array
j = json.dumps(data)

# or write to a file
with open('data.json', 'w') as f:
    json.dump(data, f)

相关问题