Сбор метаданных

Я пытаюсь использовать пакет сбора метаданных https://pypi.python.org/pypi/pyoai для сбора данных на этом сайте https://www.duo.uio.no/oai/request?verb=Identify

Я попробовал пример на сайте pyaoi, но это не сработало. Когда я проверяю это, я получаю ошибку. Код является:

from oaipmh.client import Client
from oaipmh.metadata import MetadataRegistry, oai_dc_reader

URL = 'http://uni.edu/ir/oaipmh'
registry = MetadataRegistry()
registry.registerReader('oai_dc', oai_dc_reader)
client = Client(URL, registry)

for record in client.listRecords(metadataPrefix='oai_dc'):
    print record

Это трассировка стека:

Traceback (most recent call last):
  File "/Users/arashsaidi/PycharmProjects/get-new-DUO/get-files.py", line 8, in <module>
    for record in client.listRecords(metadataPrefix='oai_dc'):
  File "/Users/arashsaidi/.virtualenvs/lbk/lib/python2.7/site-packages/oaipmh/common.py", line 115, in method
    return obj(self, **kw)
  File "/Users/arashsaidi/.virtualenvs/lbk/lib/python2.7/site-packages/oaipmh/common.py", line 110, in __call__
    return bound_self.handleVerb(self._verb, kw)
  File "/Users/arashsaidi/.virtualenvs/lbk/lib/python2.7/site-packages/oaipmh/client.py", line 65, in handleVerb
    kw, self.makeRequestErrorHandling(verb=verb, **kw))    
  File "/Users/arashsaidi/.virtualenvs/lbk/lib/python2.7/site-packages/oaipmh/client.py", line 273, in makeRequestErrorHandling
    raise error.XMLSyntaxError(kw)
oaipmh.error.XMLSyntaxError: {'verb': 'ListRecords', 'metadataPrefix': 'oai_dc'}

Мне нужно получить доступ ко всем файлам на странице, на которую я ссылался выше, и создать дополнительный файл с некоторыми метаданными.

Какие-либо предложения?

2 ответа

Решение

В итоге я использовал пакет Sickle, который, как мне показалось, имел намного лучшую документацию и проще в использовании:

Этот код получает все наборы, а затем извлекает каждую запись из каждого набора. Это кажется лучшим решением, учитывая тот факт, что есть более 30000 записей, с которыми нужно иметь дело. Выполнение этого для каждого набора дает больше контроля. Надеюсь, что это может помочь другим там. Я понятия не имею, почему библиотеки используют OAI, не кажется хорошим способом организовать данные для меня...

# gets sickle from OAI
        sickle = Sickle('http://www.duo.uio.no/oai/request')
        sets = sickle.ListSets()  # gets all sets
        for recs in sets:
            for rec in recs:
                if rec[0] == 'setSpec':
                    try:
                        print rec[1][0], self.spec_list[rec[1][0]]
                        records = sickle.ListRecords(metadataPrefix='xoai', set=rec[1][0], ignore_deleted=True)
                        self.write_file_and_metadata()
                    except Exception as e:
                        # simple exception handling if not possible to retrieve record
                        print('Exception: {}'.format(e))

Кажется, что ссылка с сайта pyoai ( http://uni.edu/ir/oaipmh) устарела, потому что она возвращает 404.
Тем не менее, вы должны иметь возможность получать данные с вашего сайта следующим образом:

from oaipmh.client import Client
from oaipmh.metadata import MetadataRegistry, oai_dc_reader

URL = 'https://www.duo.uio.no/oai/request'
registry = MetadataRegistry()
registry.registerReader('oai_dc', oai_dc_reader)
client = Client(URL, registry)

# identify info
identify = client.identify()
print "Repository name: {0}".format(identify.repositoryName())
print "Base URL: {0}".format(identify.baseURL())
print "Protocol version: {0}".format(identify.protocolVersion())
print "Granularity: {0}".format(identify.granularity())
print "Compression: {0}".format(identify.compression())
print "Deleted record: {0}".format(identify.deletedRecord())

# list records
records = client.listRecords(metadataPrefix='oai_dc')
for record in records:
    # do something with the record
    pass

# list metadata formats
formats = client.listMetadataFormats()
for f in formats:
    # do something with f
    pass
Другие вопросы по тегам