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.abstracthttps://pybliometrics.readthedocs.io/en/stable/classes/AbstractRetrieval.html 声明两者应产生相同但可以为空。使用此语句,如果 ab.description 为空(即 falsy),它将使用 ab.abstract 代替。