Невозможно получить все записи из репозитория OAI-PMH с помощью Sickle

Я работал над получением всех записей из репозитория OAI-PHM из различных исследовательских институтов, используя программу Sickle на Python. Я написал код, который выполняет последовательный сбор данных, который перебирает записи различных репозиториев и сохраняет записи как XML-файл, так и в SQL-данные. Ниже приведен отрывок из кода, который определяет последовательную сборку репозитория OAI из небольшого исследовательского учреждения.

Однако по какой-то причине я не могу получить все записи в репозиториях. В приведенном ниже примере для одного учреждения я могу получить только около 2,900 записей из репозитория, хотя при последней проверке значение completeListSize равно 4,041. Если я использую параметр from в сочетании с max_retries и выполняю серию выборочного сбора данных по дате в цикле, я могу получить некоторые дополнительные записи, но не все из них.

Интерфейс OAI, по-видимому, отправляет обратно пустой токен возобновления, указывающий, что все записи были получены и, следовательно, ошибок не возникает. Я подозреваю, что проблема может быть связана с тем, что некоторые записи в репозитории 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', 'from': last_retrieval, 'until': date}, ignore_deleted=True, 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)

0 ответов

Другие вопросы по тегам