поэтому я работаю с API Reddit, по некоторым причинам, не относящимся к делу, я хочу работать без использования оболочки Reddit для этого сценария.Код на самом деле очень прост, он извлекает комментарии и ответы 1 уровня из определенного поста внутри subreddit.
Это код функции,
def getcommentsforpost(subredditname,postid,):
#here we make the request to reddit, and create a python dictionary
#from the resulting json code
reditpath = '/r/' + subredditname + '/comments/' + postid
redditusual = 'https://www.reddit.com'
parameters = '.json?'
totalpath = redditusual + reditpath + parameters
p = requests.get(totalpath, headers = {'User-agent' : 'Chrome'})
result = p.json()
#we are going to be looping a lot through dictionaries, to extract
# the comments and their replies, thus, a list where we will insert
# them.
totallist = []
# the result object is a list with two dictionaries, one with info
#on the post, and the second one with all the info regarding the
#comments and their respective replies, because of this, we first
# process the posts info located in result[0]
a = result[0]["data"]["children"][0]["data"]
abody = a["selftext"]
aauthor = a["author"]
ascore = a["score"]
adictionary = {"commentauthor" : aauthor , "comment" : abody , "Type" : "Post",
"commentscore" : ascore}
totallist.append(adictionary)
# and now, we start processing the comments, located in result[1]
for i in result[1]["data"]["children"]:
ibody = i["data"]["body"]
iauthor = i["data"]["author"]
iscore = i["data"]["score"]
idictionary = {"commentauthor" : iauthor , "comment" : ibody , "Type" : "post_comment",
"commentscore" : iscore}
totallist.append(idictionary)
# to clarify, until here, the code works perfectly. No problem
# whatsoever, its exactly in the following section where the
#error happens.
# we create a new object, called replylist,
#that contains a list of dictionaries in every interaction of
#the loop.
replylists = i["data"]["replies"]["data"]["children"]
# we are going to loop through them, in every comment we extract
for j in replylists:
jauthor = j["data"]["author"]
jbody = j["data"]["body"]
jscore = j["data"]["score"]
jdictionary = {"commentauthor" : jauthor , "comment" : jbody , "Type" : "comment_reply" ,
"commentscore" : jscore }
totallist.append(jdictionary)
# just like we did with the post info and the normal comments,
# we extract and put it in totallist.
finaldf = pd.DataFrame(totallist)
return(finaldf)
getcommentsforpost("Python","a7zss0")
, но во время выполнения этого цикла для ответов код завершается ошибкой.Он возвращает эту ошибку «строковые индексы должны быть целыми числами», сигнализируя об ошибке переменным ответным спискам, но когда я выполняю код вне цикла, как это
result[1]["data"]["children"][4]["data"]["replies"]["data"]["children"][0]
, он работает отлично, он должен быть таким жеэффект.Я считаю, что он рассматривает списки ответов как строку, а не список (который является его классом)
Вещи, которые я пробовал:
Я пытался убедиться, что класс списков ответов представляет собой список сФункция type (), она доказывает, что возвращает «список», но только для 5 взаимодействий цикла, затем происходит сбой с той же ошибкой.
Я попытался сделать цикл списка с for ja in range(0,len(replylists))
, а затем создатьj
переменная как replylists[ja]
.Она выдала ту же ошибку.
Я отлаживал это два часа, без этого фрагмента кода функция работает отлично (конечно, она не возвращает ответы в конечном кадре данных, но работает),Почему это происходит?replylists
- это список словарей, а не строка, но она выдает эту странную ошибку.
Вот документация reddit для функции, которую мы используем: https://www.reddit.com/dev/api#GET_comments_{article}
Библиотеки для импорта: запросы, панды как pd, json
Повторяю, рекомендую оберткуне решение, я хочу работать с json и отдыхать.
Работаем над этим: 'Python версия 3.6.5 | Anaconda версия 5.2.0, ноутбук jupyter 5.5.0'
Заранее спасибо.Надеюсь, это будет интересно, я буду продолжать работать отсюда.