注意:这使用了一个名为PRAW的独立库,这对于理解问题并不重要,并且在下面的示例中使用# !!!
注释了模糊/相关代码,以表示只需要了解代码生成一个dicts列表,代码就是必需的。
*问题有几层深 - 将尽力解释:
我在data.json
中有JSON数据,看起来像这样:
{
"USA":[
{"shortlink":"https://short/74h13v"},
{"responses":[]}
],
"Vietnam":[
{"shortlink":"https://short/74gyn4"},
{"responses":[]}
],
"Italy":[
{"shortlink":"https://short/74h3i9"},
{"responses":[]}
]
}
在模块(scraper.py
)中,我有其他数据,其格式为comment.id="39dn28"
,comment.body="this is a comment"
我正在尝试将多个comment.id
和comment.body
个实例插入到[]
附加的responses
中,以便它看起来像这样:
{"responses": [
{"39dn28": "this is my response"},
{"39k229": "I'm another response"},
{"35sn64": "another comment"}
]}
对我来说特别棘手的是当我必须考虑每组评论与单个国家/地区的ID匹配时(或者,'短链接')。我已使用shortlinks = [data[link][0]["shortlink"][-6:] for link in data]
提取短链接ID,结果为['74h3i9', '74gyn4', '74h13v']
现在我需要将每组注释与其相应的短链接相匹配,并将这些注释输入到它们正确属于的位置。
以下是我迄今为止所做的尝试,以深入了解我所拥有的以及我想要实现的目标:
with open("data.json", "r") as f:
data = json.load(f)
shortlinks = [data[link][0]["shortlink"][-6:] for link in data]
for sl_id in shortlinks:
# !!! (the following code produces a list of comment dicts.)
submission = reddit.submission(id=sl_id)
submission.comments.replace_more(limit=0)
cmt_data = [{comment.id: comment.body} for comment in submission.comments.list()]
for i in data:
if sl_id in data[i][0]["shortlink"]:
data[i][0]["responses"] = cmt_data
print(data)
此几乎有效..出于某种原因,我还返回了额外的空白'responses': []
和其他短链接。
似乎无法弄明白。帮助很多,非常感谢。我愿意采用其他方法来完成它,以及存储数据的替代方法(可能不是一个dicts列表等等)。
答案 0 :(得分:1)
如果你想得到这样的话:
{
"USA":[
{"shortlink":"https://short/74h13v"},
{"responses":[{},{},{}]}],...]
}
我认为,它应该是这样的:
for sl_id in shortlinks:
# !!! (the following code produces a list of comment dicts.)
submission = reddit.submission(id=sl_id)
submission.comments.replace_more(limit=0)
cmt_data = [{comment.id: comment.body} for comment in submission.comments.list()]
for i in data:
if sl_id in data[i][0]["shortlink"]:
data[i][1]["responses"] = cmt_data
答案 1 :(得分:0)
for key, value in data.items():
for x in value:
if sl_id in x['shortlink']:
if not 'responses' in x:
x['responses'] = []
x['responses'] += cmt_data