关于pybliometrics.ScopusSearch的SUBJAREA过滤有效性与字段获取问询
问题解决:pybliometrics中SUBJAREA筛选失效及获取学科领域字段
一、SUBJAREA筛选失效的原因与解决办法
网页端和pybliometrics返回结果数量差异的核心原因是Scopus API不支持在查询语句中直接使用LIMIT-TO语法——网页端会自动解析该语法,但API要求将筛选条件通过单独的filter参数传递,而非嵌入query字符串。
修改代码,将LIMIT-TO的筛选条件拆分到filter参数中,核心查询逻辑保留在scopus_query里:
from pybliometrics.scopus import ScopusSearch import pandas as pd min_year = 1995 max_year = 1999 # 核心查询:仅保留关键词和年份范围 scopus_query = f'TITLE-ABS-KEY (maintenance) AND PUBYEAR > {min_year-1} AND PUBYEAR < {max_year+1}' # 筛选条件通过filter参数传递,多条件用逗号分隔 filters = 'SUBJAREA(ENGI), DOCTYPE(ar), SRCTYPE(j), LANGUAGE(English)' # 初始化ScopusSearch时传入filter参数 s = ScopusSearch(scopus_query, filter=filters, verbose=True, download=True) df = pd.DataFrame(s.results) to_drop = ['eid', 'doi', 'pii', 'pubmed_id', 'subtype', 'creator', 'afid', 'affiliation_city', 'author_count', 'author_ids', 'author_afids', 'coverDisplayDate', 'issn', 'source_id', 'eIssn','volume', 'issueIdentifier', 'article_number', 'pageRange', 'freetoread', 'freetoreadLabel', 'fund_acr', 'fund_no', 'fund_sponsor'] df = df.drop(columns=to_drop) df.to_excel(f"Maintenance_{min_year}_{max_year}.xlsx", index=False)
修改后筛选条件会被API正确解析,返回结果数量将与网页端一致。
二、获取Subject Area字段的方法
默认情况下pybliometrics返回的结果不包含学科领域信息,需通过指定view参数获取完整元数据:
- 初始化
ScopusSearch时添加view="COMPLETE"参数,该视图会返回包括学科领域在内的完整字段 - 修改后的初始化代码:
s = ScopusSearch(scopus_query, filter=filters, view="COMPLETE", verbose=True, download=True)
- 生成的DataFrame会新增
subject_area字段,该字段为列表格式,包含文献所属的所有学科领域代码及名称(例如['ENGI', 'Engineering'])
注:使用COMPLETE视图会增加API请求的数据量,可能延长下载时间,但能获取所需的学科领域信息。
内容的提问来源于stack exchange,提问作者sroverto
相关产品推荐
相关产品推荐

