无法使用Sickle

问题描述

我一直在使用Python中的Sickle程序从各个研究机构的OAI-PHM信息库中检索所有记录。我编写了执行连续收集的代码,该代码对各种存储库的记录进行迭代,并将记录另存为XML文件sql数据。以下是指定从较小的研究机构连续获取OAI存储库的代码摘录。

但是,由于某种原因,我无法检索存储库中的所有记录。在下面针对一个机构的给定示例中,即使我上次检查的completeListSize为4.041,我也只能从存储库中检索大约2.900条记录。如果我将from参数与max_retries结合使用,并按日期在循环中执行一系列选择性收获,则可以检索到一些其他记录,但不是全部。

OAI接口似乎正在发回一个空的resumptionToken,指示已检索到所有记录,因此不会引发任何错误。我怀疑该问题可能是由于OAI存储库中的某些记录某种程度上是空的或不完整的,因此该程序认为存储库中的所有记录已被检索。

我不确定是否可以通过添加其他参数来跳过空记录或发出重复请求之类的其他参数来解决此问题?

from sickle import Sickle
import re
import uuid
import pyodbc
import xml.dom.minidom
import xml.sax

api_list = [ \
"https://pure.itu.dk/ws/oai",\
]

date="2020-08.01"
last_retrieval="1950.01.01"


for api in api_list:
    institution = ""
    institution = inst_institution(api)
    record_total=0
    sickle = Sickle(api) 

    harvest_id = uuid.uuid4() # generating a random ID for the record. 

    recs = sickle.ListRecords(**{'MetadataPrefix': 'ddf-mxd','from': last_retrieval,'until': date},ignore_deleted=True,max_retries ==500000))
    headers = sickle.ListIdentifiers(**{'MetadataPrefix': 'ddf-mxd',max_retries ==500000)
    for header in headers:
        record_total = record_total + 1
        try:    
            r=recs.next()

        except IndexError:
            record_fail_total = record_fail_total + 1
            Failed_record_function(harvest_id,Sidste_indhentning,dagsdato,api,institution,record_fail_total,day_of_harvest) # Failed records being saved to sql table ”records_Failed” 

            
         rec_id = re.search('rec_id=' + chr(34) + '(.+?)' + chr(34) + ' rec_created=',str(r)).group(1)
        print (str(record_total) + " - " + str(rec_id) + " - " + str(institution)) #save a XML-file for each record
        Fil_placering = r"C:\Users\sigur\OneDrive\Skrivebord\Data\\itu\\" + str(rec_id) + ".xml"
        with open(r"C:\Users\sigur\OneDrive\Skrivebord\Data\\itu\\" + str(rec_id) + ".xml","w",encoding="UTF-8") as text_file:
            print(str(r),file=text_file)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)