如何跳过包含太多搜索结果的题名(或者从 Scopus 检索信息花费的时间太长)?
How do I skip titles that contains too many search results (or take too long to retrieve the info from Scopus)?
我想访问 ScopusSearch API 并获取保存在 excel 电子表格中的 1400 篇文章标题列表的 EID。我尝试通过以下代码检索 EID:
import numpy as np
import pandas as pd
from pybliometrics.scopus import ScopusSearch
nan = pd.read_excel(r'C:\Users\Apples\Desktop\test\titles_nan.xlsx', sheet_name='nan')
error_index = {}
for i in range(0,len(nan)):
scopus_title = nan.loc[i ,'Title']
s = ScopusSearch('TITLE("{0}")'.format(scopus_title))
print('TITLE("{0}")'.format(scopus_title))
try:
s = ScopusSearch(scopus_title)
nan.at[i,'EID'] = s.results[0].eid
print(str(i) + ' ' + s.results[0].eid)
except:
nan.loc[i,'EID'] = np.nan
error_index[i] = scopus_title
print(str(i) + 'error' )
但是,我无法检索到超过 100 个标题(大约)的 EID,因为某些标题会产生太多的搜索,这会拖延整个过程。
因此,我想跳过包含太多搜索的标题并转到下一个标题,同时记录被跳过的标题。
我刚开始使用 Python,所以我不确定该怎么做。我有以下顺序:
• 如果标题产生 1 次搜索,检索 EID 并将其记录在文件“nan”的“EID”列下。
• 如果标题产生超过 1 次搜索,将标题记录在错误索引中,打印“太多搜索”并继续下一个搜索。
• 如果标题未产生任何搜索,则将标题记录在错误索引中,打印“错误”并继续下一个搜索。
Attempt 1
for i in range(0,len(nan)):
scopus_title = nan.at[i ,'Title']
print('TITLE("{0}")'.format(scopus_title))
s = ScopusSearch('TITLE("{0}")'.format(scopus_title))
print(type(s))
if(s.count()== 1):
nan.at[i,"EID"] = s.results[0].eid
print(str(i) + " " + s.results[0].eid)
elif(s.count()>1):
continue
print(str(i) + " " + "Too many searches")
else:
error_index[i] = scopus_title
print(str(i) + "error")
Attempt 2
for i in range(0,len(nan)):
scopus_title = nan.at[i ,'Title']<br/>
print('TITLE("{0}")'.format(scopus_title))<br/>
s = ScopusSearch('TITLE("{0}")'.format(scopus_title))
if len(s.results)== 1:
nan.at[i,"EID"] = s.results[0].eid
print(str(i) + " " + s.results[0].eid)
elif len(s.results)>1:
continue
print(str(i) + " " + "Too many searches")
else:
continue
print(str(i) + " " + "Error")
我收到错误消息,指出类型 'ScopusSearch' 的 object 没有 len() /count() 或搜索或列表本身。我无法从这里继续。此外,我不确定这是否是正确的做法——根据过多的搜索跳过标题。有没有更有效的方法(例如超时-搜索一定时间后跳过标题)。
如能就此事提供任何帮助,我们将不胜感激。谢谢!
合并 .get_results_size()
与 download=False
:
from pybliometrics.scopus import ScopusSearch
scopus_title = "Editorial"
q = f'TITLE("{scopus_title}")' # this is f-string notation, btw
s = ScopusSearch(q, download=False)
s.get_results_size()
# 243142
如果这个数字低于某个阈值,只需执行 s = ScopusSearch(q)
并像“尝试 2”中那样继续:
for i, row in nan.iterrows():
q = f'TITLE("{row['Title']}")'
print(q)
s = ScopusSearch(q, download=False)
n = s.get_results_size()
if n == 1:
s = ScopusSearch(q)
nan.at[i,"EID"] = s.results[0].eid
print(f"{i} s.results[0].eid")
elif n > 1:
print(f"{i} Too many results")
continue # must come last
else:
print(f"{i} Error")
continue # must come last
(我在这里使用 .iterrows()
来摆脱索引。但是如果索引不是范围序列,i
将不正确 - 在这种情况下将所有内容包含在 enumerate()
.)
我想访问 ScopusSearch API 并获取保存在 excel 电子表格中的 1400 篇文章标题列表的 EID。我尝试通过以下代码检索 EID:
import numpy as np
import pandas as pd
from pybliometrics.scopus import ScopusSearch
nan = pd.read_excel(r'C:\Users\Apples\Desktop\test\titles_nan.xlsx', sheet_name='nan')
error_index = {}
for i in range(0,len(nan)):
scopus_title = nan.loc[i ,'Title']
s = ScopusSearch('TITLE("{0}")'.format(scopus_title))
print('TITLE("{0}")'.format(scopus_title))
try:
s = ScopusSearch(scopus_title)
nan.at[i,'EID'] = s.results[0].eid
print(str(i) + ' ' + s.results[0].eid)
except:
nan.loc[i,'EID'] = np.nan
error_index[i] = scopus_title
print(str(i) + 'error' )
但是,我无法检索到超过 100 个标题(大约)的 EID,因为某些标题会产生太多的搜索,这会拖延整个过程。
因此,我想跳过包含太多搜索的标题并转到下一个标题,同时记录被跳过的标题。
我刚开始使用 Python,所以我不确定该怎么做。我有以下顺序:
• 如果标题产生 1 次搜索,检索 EID 并将其记录在文件“nan”的“EID”列下。
• 如果标题产生超过 1 次搜索,将标题记录在错误索引中,打印“太多搜索”并继续下一个搜索。
• 如果标题未产生任何搜索,则将标题记录在错误索引中,打印“错误”并继续下一个搜索。
Attempt 1
for i in range(0,len(nan)):
scopus_title = nan.at[i ,'Title']
print('TITLE("{0}")'.format(scopus_title))
s = ScopusSearch('TITLE("{0}")'.format(scopus_title))
print(type(s))
if(s.count()== 1):
nan.at[i,"EID"] = s.results[0].eid
print(str(i) + " " + s.results[0].eid)
elif(s.count()>1):
continue
print(str(i) + " " + "Too many searches")
else:
error_index[i] = scopus_title
print(str(i) + "error")
Attempt 2
for i in range(0,len(nan)):
scopus_title = nan.at[i ,'Title']<br/>
print('TITLE("{0}")'.format(scopus_title))<br/>
s = ScopusSearch('TITLE("{0}")'.format(scopus_title))
if len(s.results)== 1:
nan.at[i,"EID"] = s.results[0].eid
print(str(i) + " " + s.results[0].eid)
elif len(s.results)>1:
continue
print(str(i) + " " + "Too many searches")
else:
continue
print(str(i) + " " + "Error")
我收到错误消息,指出类型 'ScopusSearch' 的 object 没有 len() /count() 或搜索或列表本身。我无法从这里继续。此外,我不确定这是否是正确的做法——根据过多的搜索跳过标题。有没有更有效的方法(例如超时-搜索一定时间后跳过标题)。
如能就此事提供任何帮助,我们将不胜感激。谢谢!
合并 .get_results_size()
与 download=False
:
from pybliometrics.scopus import ScopusSearch
scopus_title = "Editorial"
q = f'TITLE("{scopus_title}")' # this is f-string notation, btw
s = ScopusSearch(q, download=False)
s.get_results_size()
# 243142
如果这个数字低于某个阈值,只需执行 s = ScopusSearch(q)
并像“尝试 2”中那样继续:
for i, row in nan.iterrows():
q = f'TITLE("{row['Title']}")'
print(q)
s = ScopusSearch(q, download=False)
n = s.get_results_size()
if n == 1:
s = ScopusSearch(q)
nan.at[i,"EID"] = s.results[0].eid
print(f"{i} s.results[0].eid")
elif n > 1:
print(f"{i} Too many results")
continue # must come last
else:
print(f"{i} Error")
continue # must come last
(我在这里使用 .iterrows()
来摆脱索引。但是如果索引不是范围序列,i
将不正确 - 在这种情况下将所有内容包含在 enumerate()
.)