3

我正在使用scholarlypython 中的模块来搜索关键字。我正在返回一个生成器对象,如下所示:

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 数据框?

4

1 回答 1

3

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

诚然,该scholary库通过为您提供类似字典的字符串转换的实例并没有Author实际记录该类支持的 API 来帮助解决问题。

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

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

可以使用以下vars()函数获取对象的字典:

author_dict = vars(author)

但是,数据不一定直接映射到数据框。例如,列表如何interests在数据框表格数据结构中表示?而且您也不想包含_filledinternal 属性(如果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 页的结果。

于 2019-07-23T15:30:46.000 回答