Scopus 摘要检索 - 仅在解析条目过多时出现值和类型错误
Scopus Abstract Retrieval - Value and Type Error only when too many entries are parsed
我正在尝试通过 Scopus 摘要检索来检索摘要。我有一个包含 3590 个 EID 的文件。
import pandas as pd
import numpy as np
file = pd.read_excel(r'C:\Users\Amanda\Desktop\Superset.xlsx', sheet_name='Sheet1')
from pybliometrics.scopus import AbstractRetrieval
for i, row in file.iterrows():
q = row['EID']
ab = AbstractRetrieval(q,view='META_ABS')
file.at[i,"Abstract"] = ab.description
print(str(i) + ' ' + ab.description)
print(str(''))
我得到一个值错误 -
为了响应值错误,我更改了代码。
from pybliometrics.scopus import AbstractRetrieval
error_index_valueerror = {}
for i, row in file.iterrows():
q = row['EID']
try:
ab = AbstractRetrieval(q,view='META_ABS')
file.at[i,"Abstract"] = ab.description
print(str(i) + ' ' + ab.description)
print(str(''))
except ValueError:
print(f"{i} Value Error")
error_index_valueerror[i] = row['Title']
continue
当我用 10-15 个条目试用此代码时,它运行良好并且我检索了所有摘要。但是,当我 运行 具有 3590 个 EID 的实际文件时,输出将是类型错误之前的一系列 10-12 值错误('can only concatenate str (not "NoneType") to str surfaces.
我不确定如何解决这个问题。任何关于此事的建议将不胜感激!
(旁注:当我更改视图='FULL'(按照文档的建议)时,我仍然得到相同的结果。)
没有要检查的 EID,很难指出确切原因。但是,我 99% 确定您的问题是 .description
属性 中缺少摘要。当第一次调用为空时就足够了,因为它将把列类型变成 float
,您希望向其附加一个字符串。这就是错误所说的。
因此,您的问题与 pybliometrics 或 Scopus 无关,而是与您编写代码的方式有关。
试试这个:
import pandas as pd
import numpy as np
from pybliometrics.scopus import AbstractRetrieval
def parse_abstract(eid):
"""Retrieve Abstract of a document."""
ab = AbstractRetrieval(q, view='META_ABS')
return ab.description or ab.abstract
FNAME = r'C:\Users\Amanda\Desktop\Superset.xlsx'
df = pd.read_excel(FNAME, sheet_name='Sheet1')
df["abstract"] = df["EID"].apply(parse_abstract)
我使用 pandas' .apply()
方法,而不是在循环中附加值 one-by-one,这很慢而且 error-prone。
另请注意我的写作方式ab.description or ab.abstract
。 https://pybliometrics.readthedocs.io/en/stable/classes/AbstractRetrieval.html 声明两者应产生相同但可以为空。使用此语句,如果 ab.description
为空(即 falsy),它将使用 ab.abstract
代替。
我正在尝试通过 Scopus 摘要检索来检索摘要。我有一个包含 3590 个 EID 的文件。
import pandas as pd
import numpy as np
file = pd.read_excel(r'C:\Users\Amanda\Desktop\Superset.xlsx', sheet_name='Sheet1')
from pybliometrics.scopus import AbstractRetrieval
for i, row in file.iterrows():
q = row['EID']
ab = AbstractRetrieval(q,view='META_ABS')
file.at[i,"Abstract"] = ab.description
print(str(i) + ' ' + ab.description)
print(str(''))
我得到一个值错误 -
为了响应值错误,我更改了代码。
from pybliometrics.scopus import AbstractRetrieval
error_index_valueerror = {}
for i, row in file.iterrows():
q = row['EID']
try:
ab = AbstractRetrieval(q,view='META_ABS')
file.at[i,"Abstract"] = ab.description
print(str(i) + ' ' + ab.description)
print(str(''))
except ValueError:
print(f"{i} Value Error")
error_index_valueerror[i] = row['Title']
continue
当我用 10-15 个条目试用此代码时,它运行良好并且我检索了所有摘要。但是,当我 运行 具有 3590 个 EID 的实际文件时,输出将是类型错误之前的一系列 10-12 值错误('can only concatenate str (not "NoneType") to str surfaces.
我不确定如何解决这个问题。任何关于此事的建议将不胜感激!
(旁注:当我更改视图='FULL'(按照文档的建议)时,我仍然得到相同的结果。)
没有要检查的 EID,很难指出确切原因。但是,我 99% 确定您的问题是 .description
属性 中缺少摘要。当第一次调用为空时就足够了,因为它将把列类型变成 float
,您希望向其附加一个字符串。这就是错误所说的。
因此,您的问题与 pybliometrics 或 Scopus 无关,而是与您编写代码的方式有关。
试试这个:
import pandas as pd
import numpy as np
from pybliometrics.scopus import AbstractRetrieval
def parse_abstract(eid):
"""Retrieve Abstract of a document."""
ab = AbstractRetrieval(q, view='META_ABS')
return ab.description or ab.abstract
FNAME = r'C:\Users\Amanda\Desktop\Superset.xlsx'
df = pd.read_excel(FNAME, sheet_name='Sheet1')
df["abstract"] = df["EID"].apply(parse_abstract)
我使用 pandas' .apply()
方法,而不是在循环中附加值 one-by-one,这很慢而且 error-prone。
另请注意我的写作方式ab.description or ab.abstract
。 https://pybliometrics.readthedocs.io/en/stable/classes/AbstractRetrieval.html 声明两者应产生相同但可以为空。使用此语句,如果 ab.description
为空(即 falsy),它将使用 ab.abstract
代替。