1

我正在尝试通过 Scopus Abstract Retrieval 检索摘要。我有一个包含 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 个值错误,然后出现类型错误(“只能将 str(而不是“NoneType”)连接到 str 表面。

一系列值错误和类型错误

我不确定如何解决这个问题。任何关于此事的建议将不胜感激!

(旁注:当我更改 view='FULL' (按照文档的建议)时,我仍然得到相同的结果。)

4

1 回答 1

1

如果没有要检查的 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)

.apply()我使用 pandas 的方法,而不是在一个缓慢且容易出错的循环中逐个附加值。

还要注意我的写作方式ab.description or ab.abstracthttps://pybliometrics.readthedocs.io/en/stable/classes/AbstractRetrieval.html指出两者都应该产生相同但可以为空。有了这个语句,如果ab.description是空的(即,假的),它将使用ab.abstract代替。

于 2022-02-27T08:27:17.537 回答