我在python中使用scholarly模块搜索关键字。我得到一个生成器对象,如下所示:

import pandas as pd
import numpy as np
import scholarly

search_query = scholarly.search_keyword('Python')
print(next(search_query))

{'_filled': False,
 'affiliation': 'Juelich Center for Neutron Science',
 'citedby': 75900,
 'email': '@fz-juelich.de',
 'id': 'zWxqzzAAAAAJ',
 'interests': ['Physics', 'C++', 'Python'],
 'name': 'Gennady Pospelov',
 'url_picture': 'https://scholar.google.com/citations?view_op=medium_photo&user=zWxqzzAAAAAJ'}


我想访问元素“ citedby”,但是当我尝试执行next(search_query)['citedby']时,它将返回TypeError: 'Author' object is not subscriptable

我的问题是如何访问生成器对象中的元素?以及如何将该对象转换为Pandas数据框?

最佳答案

这不是发电机问题。生成器生成的对象不是字典。

诚然,scholary库不能通过给Author实例提供类似于字典的字符串转换,并且没有实际记录该类所支持的API来解决问题。

Author表示形式中的每个“键”实际上都是对象的一个​​属性:

author = next(search_query)
print(author.citedby)


您可以使用vars() function获取该对象的字典:

author_dict = vars(author)


但是,数据不一定直接映射到数据框。例如,interests列表将如何在数据框表格数据结构中表示?而且您也不希望包含_filled内部属性(这是一个标记,用于记录是否已调用author.fill())。

就是说,您可以通过在vars函数上映射生成器来从字典创建一个数据框:

search_query = scholarly.search_keyword('Python')
df = pd.DataFrame(map(vars, search_query))


然后在必要时删除_filled列,然后将interests列转换为更具结构性的内容,例如具有0/1值或类似值的单独列。

请注意,这会很慢,因为scholarly库页面会依次浏览Google搜索结果,并且库故意将请求延迟,每次5-10秒的随机睡眠间隔,以避免Google阻止请求。因此,您必须要有耐心,因为Python关键字搜索很容易产生将近30页的结果。

07-24 09:52
查看更多